perm filename RUNOFF.MAC[S,DWP] blob sn#172451 filedate 1975-08-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00067 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00006 00002	DEFINE VER(V),<
C00008 00003		CALLI DEFINITIONS
C00009 00004		DEFINE	JA(ADDR) <
C00010 00005		MISCELLANEOUS DEFINITIONS
C00013 00006		STATE REGISTER #2 BITS
C00014 00007		LOC	137
C00016 00008		OPEN	TTY,TTYIO	OPEN UP TTY CHANNEL
C00019 00009	OPN1:	OPEN	IN,OPENI	OPEN INPUT CHANNEL IF NOT TTY
C00022 00010	OPN4:	MOVEM	A3,OPNT+1
C00025 00011	S1:	TRNN	S,SEQNO		ARE THERE SEQUENCE NUMBERS?
C00027 00012	S4:	MOVEI	CNT,0		LOOKUP COMMAND
C00030 00013	S10:	JM	FILLM,S11	JUMP IF IN FILL MODE
C00033 00014	S14:	MOVEM	T3,ALNGTH	UPDATE ACCUMULATED LENGTH
C00035 00015	OUTLIN:	TLZN	S,HEADL		IS LINE A HEADING LINE?
C00038 00016	OUTL4:	JNM	HEADM,OUTL6	JUMP IF NO HEADING TO OUTPUT
C00040 00017	OUTL12:	PUSHJ	P,OUTPG3	OUTPUT A CR LF
C00043 00018	OUTL20:	TRZN	S,CENTOL	CENTER NEXT LINE OF OUTPUT?
C00046 00019	OUTL24:	TLZE	S,SPACEM	SPACE SOME LINES?
C00048 00020	OUTPGN:	MOVE	T1,PAGENO	GET PAGE NUMBER IN T1
C00050 00021	ACCUM:	AOS	T1,SYMCNT	INCREMENT SYMBOL COUNT
C00053 00022	ACCUM5:	TLNE	S,ULINEM	UNDERLINE SYMBOL?
C00056 00023	ACCU6A:	TRC	S,UCS		COMPLEMENT UPPER CASE SHIFT BIT
C00059 00024	ACCU11:	JNM	FILLM,ACCU12	JUMP IF NOFILL MODE
C00062 00025		GET:	<DEVICE>:<FILE>.<EXT>[<PROJECT>,<PROGRAMMER>]
C00064 00026		GET SIXBIT NAME
C00066 00027		OUTPUT ROUTINE
C00069 00028	COUT0C:	MOVE	C,CC		C = CHARACTER TO BE OUTPUT
C00071 00029	COUT1A:	PUSHJ	P,COUT6		DO IT
C00073 00030		INPUT ROUTINE
C00076 00031		TYPE STRING ROUTINE
C00077 00032		TABLE OF DIRECT COMMANDS TO RUNOFF
C00079 00033		DONE<CRLF>
C00080 00034		SKIP <N><CRLF>
C00082 00035		LM <N><CRLF>
C00084 00036		SLOW <N><CRLF>
C00086 00037		TRANSLATION TABLE: ASCII TO IBM 2741 (JOSS)
C00088 00038	BALL1:		JOSS BALL (#934)
C00093 00039	JOSS 167,<LC,C,B,8,2,1>
C00094 00040	BALL2:			#137M
C00096 00041	BALL3:			#938
C00098 00042	BALL4:			#015
C00100 00043		DEFINE	CMD(NAME,ABRV,MODE) <
C00103 00044		BREAK OFF PREVIOUS LINE
C00105 00045		SET LINE LENGTH
C00107 00046		DO NOT RIGHT JUSTIFY LINES
C00109 00047		SET SINGLE SPACING (I.E. RESET DOUBLE SPACING MODE)
C00111 00048		PROCESS FIGURE PAGE
C00113 00049		SET TABS
C00115 00050		TAB TO NEXT TAB SETTING OR TO SPECIFIED POSITION
C00117 00051		BEGIN PAGE COMMAND
C00118 00052		CHARACTER CLASS TABLE
C00120 00053		DEFINE	BY(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11),<
C00122 00054	CLASS:
C00123 00055		ASCII 020-037
C00124 00056		ASCII 040-057
C00125 00057		ASCII 060-077
C00126 00058		ASCII 100-117
C00127 00059		ASCII 120-137
C00128 00060		ASCII 140-157
C00129 00061		ASCII 160-177
C00130 00062	SPECER:	MOVEI	PNT,[ASCIZ /Error in specification!/]
C00132 00063		LIT
C00133 00064		DATA AREA (IMPURE DATA AREA)
C00134 00065		RELOC	LC-140
C00137 00066		FORMAT OF SYMBOL POINTER WORD IN SYMBOL POINTER TABLE:
C00138 00067	
C00139 ENDMK
C⊗;
DEFINE VER(V),<
TITLE RUNOFF - DOCUMENTATION PROCESSOR   -- VERSION #'V
RUNVER=<XWD V,0>>
	VER(36)
SUBTTL  A. K. OLSON

	TWOSEG
	MLON


;	TTCALL DEFINITIONS

	OPDEF	OUTCHR[TTCALL 1,]
	OPDEF	OUTSTR[TTCALL 3,]
	OPDEF	INCHWL[TTCALL 4,]
	OPDEF	INCHSL[TTCALL 5,]
	OPDEF	GETLIN[TTCALL 6,]
	OPDEF	SETLIN[TTCALL 7,]
	OPDEF	CLRBFI[TTCALL 11,]
	OPDEF	CLRBFO[TTCALL 12,]


;	REGISTER DEFINITIONS

	S=0				;SWITCH REGISTER
	SS=1				;SECOND SWITCH REGISTER
	P=2				;PUSH DOWN POINTER
	C=3				;CHARACTER REGISTER
	CC=C+1				;CHARACTER CLASS REGISTER
	PNT=CC+1			;POINTER WORD REGISTER
	CNT=PNT+1			;COUNTER REGISTER
	SP=CNT+1			;SYMBOL POINTER
	T1=SP+1				;TEMPORARY ACCUMULATOR #1
	T2=T1+1				;TEMPORARY ACCUMULATOR #2
	T3=T2+1				;TEMPORARY ACCUMULATOR #3
	A1=T3+1
	A2=A1+1
	A3=A2+1
	A4=A3+1
	A5=A4+1
	A6=A5+1

;	FILE SPECIFICATION ASSUMPTIONS

	AIEXT=<SIXBIT /   RNO/>		;ASSUMED INPUT FILE EXTENSION
	AOEXT=<SIXBIT /   LST/>		;ASSUMED OUTPUT FILE EXTENSION
	ADVND=<SIXBIT /   TTY/>		;ASSUMED DEVICE IF NO FILE SPECIFIED
	ADVFS=<SIXBIT /   DSK/>		;ASSUMED DEVICE IF FILE SPECIFIED
;	CALLI DEFINITIONS

	RESET=0
	DEVCHR=4
	CORE=11
	EXIT=12
	SLEEP=31


;	MACRO AND OPDEF DEFINITIONS

	OPDEF	GET[PUSHJ P,GETIT]
	OPDEF	GETC[PUSHJ P,CIN]
	OPDEF	OUTC[PUSHJ P,COUT]
	OPDEF	OUTLF[PUSHJ P,COUTLF]
	OPDEF	OUTSP[PUSHJ P,COUTSP]

	DEFINE	TYPE(A) <
	XLIST
	MOVE	PNT,[POINT 7,A]
	PUSHJ	P,TYPEIT
	LIST>

	DEFINE	JE(CHR,ADDR) <
	XLIST
	CAIN	C,CHR
	JRST	ADDR
	LIST>

	DEFINE	JNE(CHR,ADDR) <
	XLIST
	CAIE	C,CHR
	JRST	ADDR
	LIST>

	DEFINE	JN(ADDR) <
	XLIST
	TLNE	CC,CN
	JRST	ADDR
	LIST>

	DEFINE	JNN(ADDR) <
	XLIST
	TLNN	CC,CN
	JRST	ADDR
	LIST>
	DEFINE	JA(ADDR) <
	XLIST
	JUMPL	CC,ADDR
	LIST>

	DEFINE	JNA(ADDR) <
	XLIST
	JUMPGE	CC,ADDR
	LIST>

	DEFINE	JM(MODE,ADDR) <
	XLIST
IFE MODE-400000,<
	JUMPL	S,ADDR
	>
IFN MODE-400000,<
	TLNE	S,MODE
	JRST	ADDR>
	LIST>

	DEFINE	JNM(MODE,ADDR) <
	XLIST
IFE MODE-400000,<
	JUMPGE	S,ADDR
	>
IFN MODE-400000,<
	TLNN	S,MODE
	JRST	ADDR>
	LIST>

	DEFINE	B(V,L),<
V:	BLOCK	L>
;	MISCELLANEOUS DEFINITIONS

	PSL=100			;PUSH-DOWN STACK LENGTH
	IN=1			;INPUT CHANNEL
	OUT=2			;OUTPUT CHANNEL
	TTY=3			;TTY I/O CHANNEL


;	STATE REGISTER BITS
;
;	LEFT HALF:

	STOPM=1B18		;STOP AFTER EACH PAGE IS PROCESSED
	JUSTM=1B19		;JUSTIFY RIGHT MARGIN
	FILLM=1B20		;FILL LINE 
	HEADM=1B21		;PUT OUT PAGE HEADER
	DSPCM=1B22		;DOUBLE SPACE MODE (OFF MEANS SINGLE SPACE)
	CAPSM=1B23		;CAPITALIZE SENTENCES 
	LOWCM=1B24		;CONVERT LETTERS TO LOWER CASE
	BREAKM=1B25		;BREAK MODE
	PNTOP=1B26		;NUMBER PAGES AT TOP
	PNBOT=1B27		;NUMBER PAGES AT BOTTOM
	ULINEM=1B28		;UNDERLINE ALL SYMBOLS ON NEXT TEXT LINE
	UCM=1B29		;MAKE ALL LETTERS ON NEXT TEXT LINE UPPER CASE
	SOSM=1B30		;START OF SENTENCE SWITCH
	HEADL=1B31		;NEXT LINE IS A HEADING LINE
	CENTRL=1B32		;CENTER THE NEXT LINE
	NPAGEM=1B33		;SKIP TO A NEW PAGE ON NEXT OUTLIN
	SPACEM=1B34		;SPACE THE AMOUNT IN SPCNT BEFORE NEXT LINE
	DENTM=1B35		;INDENTATION FROM LEFT MARGIN FOR NEXT LINE ONLY


;	RIGHT HALF:

	LPAGEM=1B18		;THIS IS THE LAST PAGE
	SEQNO=1B19		;INPUT FILE HAS SEQUENCE NUMBERS
	TTY33=1B20		;OUTPUT IN TTY 33 MODE
	TTY37=1B21		;OUTPUT IN TTY 37 MODE
	LP10=1B22		;OUTPUT IN LP10A,B,C MODE
	LP10E=1B23		;OUTPUT IN LP10E MODE
	PPM=1B24		;ADD PAGE PREFIX TO ALL PAGE NUMBERS
	PPL=1B25		;NEXT TEXT LINE IS PAGE PREFIX
	FIGM=1B26		;PROCESSING A FIGURE
	OFIGSW=1B27		;OUTPUTING A FIGURE
	FIGFF=1B28		;FIGURE FUDGE FLIP-FLOP
	CRSW=1B29		;CARRIAGE RETURN FORCE SWITCH
	SLWSW=1B30		;SLOW TYPING SPEED SWITCH
	T2741=1B31		;TERMINAL IS AN IBM 2741
	PSEOS=1B32		;PREVIOUS SYMBOL WAS END OF SENTENCE
	UCS=1B33		;UPPER CASE SHIFT MODE
	CENTOL=1B34		;CENTER NEXT LINE WHEN OUTPUT
	ULS=1B35		;UNDERLINE SHIFT
;	STATE REGISTER #2 BITS
;
;	LEFT HALF:

	UCSHF=1B18		;SHIFT MODE FOR IBM 2741
	DONTUL=1B19		;DON'T UNDERLINE SWITCH
	SSALSW=1B20		;SPLIT SYMBOLS ACROSS LINES
	PCSPSW=1B21		;PREVIOUS CHARACTER WAS A SPACE
	CARDIN=1B22		;INPUT IS FROM CARDS
	DLYSPC=1B23		;DELAY SPACES
	ODLYSP=1B24		;OUTPUT DELAYED SPACES


;	PAGE FORMAT DEFINITIONS

	LL=↑D60			;LINE LENGTH
	TOPM=↑D9		;TOP MARGIN
	BOTM=↑D9		;BOTTOM MARGIN
	LFTM=↑D5		;LEFT MARGIN = 1.5" FOR TTY 37 (1.25" FOR TTY 33)
	PPRL=↑D66		;PAPER LENGTH
	MAXLL=↑D132		;MAXIMUM LINE LENGTH
	PHASE=3			;LINE PRINTER PHASING CONSTANT
	LOC	137
	EXP	RUNVER
	RELOC	400000


	EXTERNAL JOBSA,JOBFF,JOBREL

RUNOFF:	TDZA	S,S		;NOT CCL ENTRY, SKIP
	MOVEI	S,0		;CCL ENTRY
	SETZ	SS,
	MOVEI	T1,ENDRUN	;FUDGE JOBSA
	HRLM	T1,JOBSA
	CALLI	RESET		;RESET I/O
	MOVEI	T1,ENDRUN-1	;GET ENOUGH CORE
	CALLI	T1,CORE		;DO CORE UUO
	CALLI	12		;NO CORE, EXIT
	MOVE	T1,[XWD DATA,140]
	BLT	T1,DATAE	;INITIALIZE DATA AREA CONSTANTS
	SETZM	DATBEG		;CLEAR DATA AREA
	MOVE	T1,[XWD DATBEG,DATBEG+1]
	BLT	T1,ENDRUN-1
	MOVEI	T1,SYMTAB
	HRLM	T1,SYMPNT-1
	SETOM	FIGCNT		;INITIALIZE FIGURE COUNT
	MOVEI	T1,1
	MOVEM	T1,RANDOM	;INITIALIZE RANDOM NUMBER GENERATOR
	MOVEM	T1,PAGENO	;INITIALIZE PAGE NUMBER
	SETZM	SKPCNT		;CLEAR PAGE SKIP COUNTER
	MOVEI	T1,TOPM		;INITIALIZE PAGE DEFINITION PARAMETERS
	MOVEM	T1,TOPMRG
	MOVEI	T1,BOTM
	MOVEM	T1,BOTMRG
	MOVEI	T1,LFTM
	MOVEM	T1,LFTMRG
	MOVEI	T1,LL
	MOVEM	T1,LINEL
	MOVEI	T1,PPRL
	MOVEM	T1,PAPERL
	SUBI	T1,TOPM
	MOVEM	T1,BOTLIN
	OR	S,ISTATE	;INITIALIZE STATE VECTOR
	MOVE	P,[IOWD PSL,PS]	;INITIALIZE PUSH-DOWN STACK
	PUSHJ	P,STCOM3	;INITIALIZE TABS
	OPEN	TTY,TTYIO	;OPEN UP TTY CHANNEL
	HALT	RUNOFF		;CAN'T DO IT, ERROR
	OUTPUT	TTY,		;DO DUMMY OUTPUT
	TYPE	[ASCIZ "*"]
	PUSHJ	P,GFILE		;GET FIRST FILE
	MOVSI	T1,ADVND
	MOVEM	T1,OPENO+1	;USE TTY IN CASE NO OUTPUT DEVICE SPECIFIED
	CAIE	C,"←"		;IS FIRST FILE NULL?
	JRST	RUN2		;YES
	JUMPN	A1,RUN1		;NO. JUMP IF DEVICE SPECIFIED
	MOVSI	A1,ADVND
	SKIPE	A2		;IS FILE NAME NULL?
	MOVSI	A1,ADVFS	;NO. ASSUME DEVICE IS ASSUMED DIRECTORY DEVICE
RUN1:	MOVEM	A1,OPENO+1	;STORE OUTPUT DEVICE NAME
	MOVEM	A2,EB		;STORE OUTPUT FILE NAME
	SKIPN	A3		;WAS EXTENSION SPECIFIED?
	MOVSI	A3,AOEXT	;NO. USE ASSUMED OUTPUT FILE EXTENSION
	HLLZM	A3,EB+1		;STORE OUTPUT FILE EXTENSION
	SETZM	EB+2
	MOVEM	A4,EB+3		;STORE DIRECTORY
	PUSHJ	P,GFILE		;GET SECOND FILE
RUN2:	CAIE	C,15		;IS DELIMITER A CR?
	JRST	SPECER		;NO. ERROR
	JUMPN	A1,RUN3		;YES. JUMP IF DEVICE SPECIFIED
	MOVSI	A1,ADVND
	SKIPE	A2		;IS FILE NAME NULL?
	MOVSI	A1,ADVFS	;NO. ASSUME DEVICE IS ASSUMED DIRECTORY DEVICE
RUN3:	MOVEM	A1,OPENI+1	;STORE INPUT DEVICE NAME
	MOVEM	A2,LB		;STORE INPUT FILE NAME
	SKIPN	A3		;WAS EXTENSION SPECIFIED?
	MOVSI	A3,AIEXT	;NO. USE ASSUMED INPUT FILE EXTENSION
	HLLZM	A3,LB+1		;STORE INPUT FILE EXTENSION
	SETZM	LB+2
	MOVEM	A4,LB+3		;STORE DIRECTORY
	MOVE	A1,OPENI+1	;A1 = INPUT DEVICE NAME
	MOVEI	A2,IN		;INITIALIZE I/O ROUTINES
	MOVEI	A3,INBUF+1
	CAME	A1,[SIXBIT /TTY/]
	JRST	OPN1
	MOVEI	A2,TTY
	MOVEI	A3,TTYI+1
	JRST	OPN2
OPN1:	OPEN	IN,OPENI	;OPEN INPUT CHANNEL IF NOT TTY
	JRST	OPNERR		;ERROR
	INBUF	IN,2
	LOOKUP	IN,LB		;LOOKUP INPUT FILE
	JRST	LKERR		;ERROR
OPN2:	MOVEM	A3,IPNT+1
	ADDI	A3,1
	MOVEM	A3,IPNT+2
	DPB	A2,[POINT 4,IPNT,12]
	DPB	A2,[POINT 4,IPNT+3,12]
	MOVE	A1,OPENO+1	;A1 = OUTPUT DEVICE
	CAMN	A1,[SIXBIT /TTY22/] ;IBM 2741 (UCI)?
	JRST	.+3		;YES.
	CAME	A1,[SIXBIT /2741/] ;SPECIAL TEST FOR IBM 2741
	JRST	OPN2A		;NO. JUMP
	MOVEI	T1,10		;YES. DO OUTPUT IN IMAGE MODE
	HRRM	T1,OPENO
	TLZ	SS,UCSHF	;SET LOWER CASE INITIALLY
	TRO	S,T2741		;INDICATE OUTPUT TO IBM 2741
	MOVEI	A1,↑D15		;SET LEFT MARGIN TO 1.5"
	MOVEM	A1,LFTMRG
	TDZA	A1,A1		;CLEAR A1 AND SKIP
OPN2A:	CALLI	A1,DEVCHR	;GET OUTPUT DEVICE CHARACTERISTICS
	MOVEI	T1,100
	TLNE	A1,40000	;IS DEVICE A LINE PRINTER?
	ORM	T1,OPENO	;YES. SUPPRESS SLASHED 0'S
	MOVEI	A2,OUT
	MOVEI	A3,OUTBUF+1
	TLNN	A1,10		;TAKE SPECIAL ACTION FOR TTY
	JRST	OPN3
	MOVSI	T2,'TTY'	;UNTIL SOMETHING BETTER CAN BE DONE
	CAME	T2,OPENO+1
	JRST	OPN3
	SETO	A2,
	GETLCH	A2
	TLNE	A2,(1B13)
	TRO	S,TTY37
	MOVEI	A2,TTY
	MOVEI	A3,TTYO+1
	JRST	OPN4
OPN3:	OPEN	OUT,OPENO	;OPEN OUTPUT CHANNEL
	JRST	LPTTST		;ERROR
OPN3A:	TRNE	S,T2741		;OUTPUT TO IBM 2741?
	OUTBUF	OUT,↑D10	;YES. ALLOCATE 10 BUFFERS
	ENTER	OUT,EB		;ENTER OUTPUT FILE
	JRST	ENTERR		;ERROR
	OUTPUT	OUT,		;DO DUMMY OUTPUT
OPN4:	MOVEM	A3,OPNT+1
	ADDI	A3,1
	MOVEM	A3,OPNT+2
	DPB	A2,[POINT 4,OPNT,12]
	SKIPG	T1,@IPNT+2	;DO WE HAVE AN INPUT BUFFER?
	XCT	IPNT		;NO. GET IT
	MOVE	T1,@IPNT+1	;GET 1ST WORD OF INPUT BUFFER
	MOVE	T1,1(T1)
	TRNE	T1,1		;IS IT A SEQUENCE NUMBER?
	TRO	S,SEQNO		;YES. SET SEQUENCE NUMBERS SWITCH
	MOVE	T1,OPENO+1	;T1 = OUTPUT DEVICE
	CALLI	T1,DEVCHR	;GET DEVICE CHARACTERISTICS
	TLNE	T1,10		;IS DEVICE A TTY?
	TRO	S,TTY33		;YES. ASSUME TTY 33
	TLNN	T1,40000	;IS DEVICE A LPT?
	JRST	OPN5		;NO. SKIP
	TRO	S,LP10		;YES. ASSUME LP10
	MOVEI	T2,↑D15		;SET LEFT MARGIN TO 1.5"
	MOVEM	T2,LFTMRG
OPN5:	PUSH	P,[RUN7]	;FUDGE RETURN TO RUN7
RUN4:	TYPE	BELL		;RING BELL
	MOVEI	CNT,6
	MOVE	PNT,[POINT 6,A1]
	MOVEI	A1,0
	PUSHJ	P,GSIXB		;GET COMMAND IN A1
	MOVEI	CNT,CTL-1	;LOOKUP COMMAND IN TABLE
RUN5:	CAMN	A1,CMTBL(CNT)	;HAVE WE FOUND IT?
	JRST	RUN6		;YES. TAKE ACTION
	SOJGE	CNT,RUN5	;NO. TRY NEXT COMMAND
	PUSHJ	P,COMER		;NOT FOUND, ERROR
RUN6:	PUSHJ	P,@CMTBLR(CNT)
	JRST	RUN4
RUN7:	MOVEI	C,12		;C = LF
	TRNN	S,LP10!LP10E	;LINE PRINTER OUTPUT?
	JRST	RUN8		;NO. JUMP
	MOVEI	C,23		;YES. USE DC3 INSTEAD OF LF
	MOVEI	T1,↑D66-PHASE	;T1 = SPACING COUNT TO GET PAGE IN PHASE
	OUTC			;GET PAGE IN PHASE
	SOJG	T1,.-1
RUN8:	MOVEM	C,LFCHR		;STORE LINE FEED CHARACTER
	MOVE	T2,LFTMRG	;SET PAGE BIAS
	MOVEM	T2,PGBIAS
	MOVE	T2,LINEL
	MOVEM	T2,ILL		;SAVE INITIAL LINE LENGTH
	TRNN	S,T2741		;IBM 2741?
	JRST	S1		;NO. JUMP
	MOVEI	C,CIRCLD	;YES. SET IT IN RECEIVE MODE
	SOS	@OPNT+2
	IDPB	C,@OPNT+1
	MOVEI	C,SHFTLC	;SHIFT TO LOWER CASE
	SOS	@OPNT+2
	IDPB	C,@OPNT+1
S1:	TRNN	S,SEQNO		;ARE THERE SEQUENCE NUMBERS?
	JRST	.+7		;NO. SKIP
	GETC
	GETC
	GETC
	GETC
	GETC
	GETC
	GETC			;GET FIRST CHARACTER OF LINE
	CAIN	C,14		;IGNORE FORM FEEDS
	JRST	.-2
	JNE	".",S7		;IF NOT COMMAND LINE, JUMP
	GETC			;GET NEXT CHARACTER
S1A:	SETZB	A1,A2		;GET READY TO SCAN COMMAND
	SETZB	A3,A4
	SETZB	A5,NUMARG	;CLEAR NUMERIC ARGUMENT
	MOVEI	CNT,↑D24
	SKIPA	PNT,[POINT 6,A1]
S2:	GETC			;GET NEXT CHARACTER
	JE	" ",S2		;IGNORE SPACES
	JNA	S3		;JUMP IF NOT A LETTER
	SOJL	CNT,S2		;JUST USE 1ST 24 CHARACTERS
	ORI	C,40		;ADJUST FOR UPPER CASE
	IDPB	C,PNT		;STORE CHARACTER
	JRST	S2		;CONTINUE
S3:	JN	S6		;IF NUMBER, JUMP
S3A:	JE	15,S4		;IF DELIMITER IS CRLF, PROCESS COMMAND
	JE	".",S3B		;IF IT'S A ".", PROCESS COMMAND
	GETC			;OTHERWISE IGNORE GARBAGE
	JRST	S3A
S3B:	GETC
S4:	MOVEI	CNT,0		;LOOKUP COMMAND
S4A:	CAMN	A1,COMTAB+4(CNT)
	JRST	S4B		;ABBREVIATION FOUND
	CAMN	A1,COMTAB(CNT)
	CAME	A2,COMTAB+1(CNT)
	JRST	S5		;NOT FOUND
	CAMN	A3,COMTAB+2(CNT)
	CAME	A4,COMTAB+3(CNT)
	JRST	S5		;NOT FOUND, TRY NEXT ENTRY
S4B:	HLLZ	T1,COMTAB+5(CNT)
	PUSH	P,COMTAB+5(CNT)	;SAVE COMMAND ADDRESS
	PUSH	P,T1		;SAVE NEW MODE BITS
	TLNE	T1,BREAKM	;BREAK?
	PUSHJ	P,BRKCOM
	POP	P,T1		;T1 = NEW MODE BITS
	OR	S,T1		;UPDATE STATE WORD
	POP	P,T1		;T1 = COMMAND ADDRESS
	TLZ	S,BREAKM	;RESET BREAK MODE
	PUSHJ	P,(T1)		;EXECUTE COMMAND
S4C:	JE	15,S1		;IF LAST CHARACTER A CRLF, START NEW LINE
	JRST	S1A		;OTHERWISE, CONTINUE COMMAND LINE
S5:	ADDI	CNT,6		;INCREMENT TABLE INDEX
	CAIGE	CNT,COMTBL	;ANY MORE COMMANDS IN TABLE?
	JRST	S4A		;YES, TRY NEXT
	JE	54,S3A
	JRST	S4C		;COMMAND NOT FOUND, IGNORE IT
S6:	MOVEI	A5,-"0"(C)	;CONVERT 1ST DIGIT
S6A:	GETC
	JNN	S6B		;IF NOT DIGIT, JUMP
	IMULI	A5,↑D10
	ADDI	A5,-"0"(C)	;BUILD NUMBER
	JRST	S6A		;GET NEXT DIGIT
S6B:	MOVEM	A5,NUMARG	;SAVE NUMERIC ARGUMENT
	JE	54,S4
	JRST	S3A
S7:	JNE	" ",S9		;PARAGRAPH?
	JNM	FILLM,S9	;NO PARAGRAPHS IN NOFILL MODE
	PUSHJ	P,BRKCOM	;YES. BREAK OFF PREVIOUS LINE
	SKIPE	T1,DENT		;ARE WE ALREADY INDENTED?
	ADDM	T1,LINEL	;YES. ADJUST LINE LENGTH
	MOVEI	T1,5		;INDENT 5 SPACES ON NEXT LINE
	TLO	S,DENTM
	MOVEM	T1,DENT
	SUB	T1,LINEL	;ADJUST LINE LENGTH
	MOVNM	T1,LINEL
S8:	GETC			;GET NEXT CHARACTER
S9:	TLNE	S,HEADL!CENTRL	;IS LINE EITHER A HEADING OR TO BE CENTERED?
	JRST	S16		;YES.  PROCESS IT
	TRZE	S,PPL		;IS LINE A PAGE PREFIX?
	JRST	S18		;YES, JUMP
S10:	JM	FILLM,S11	;JUMP IF IN FILL MODE
	PUSHJ	P,ACCUM		;NOFILL, ACCUMULATE SYMBOL
S10A:	PUSHJ	P,OUTLIN	;OUTPUT LINE
	SETZM	SYMCNT		;RESET SYMBOL COUNTER
S10B:	TLZ	S,UCM!ULINEM	;RESET UPPER CASE AND UNDERLINE MODES
	JRST	S1		;PROCESS NEXT LINE
S11:	TLNN	CC,CF		;IS CHARACTER A FILL MODE CHARACTER?
	JRST	S15		;NO
S12:	PUSHJ	P,ACCUM		;YES. ACCUMULATE SYMBOL
	MOVE	T1,ALNGTH	;GET ACCUMULATED LENGTH
	MOVE	T2,SYMCNT
	LDB	T3,PSYML	;T3 = CURRENT SYMBOL LENGTH
	ADD	T3,T1		;T3 = SYMBOL LENGTH + ACCUMULATED LENGTH
	CAMGE	T3,LINEL	;IS SYM LTH + ACCM LTH .GEQ. LINE LENGTH?
	AOJA	T3,S14		;NO. T3 = ACCUM LTH + SYM LTH + 1
	CAME	T3,LINEL	;YES. EQUAL?
	JRST	S13		;NO
	TRZE	S,PSEOS		;YES. SYMBOL END OF SENTENCE?
	AOJA	T3,S14		;YES. STORE SYMBOL
	MOVEM	T3,ALNGTH	;NO. STORE ACCUMULATED LENGTH
	PUSHJ	P,OUTLIN	;OUTPUT LINE
	SETZM	SYMCNT
	SETZM	ALNGTH
	JRST	S10		;CONTINUE PROCESSING
S13:	TRZE	S,PSEOS		;PREVIOUS SYMBOL END OF SENTENCE?
	SOS	ALNGTH		;YES. DECREMENT ACCUMULATED LENGTH
	CAIE	T2,2		;IS SYMBOL COUNT = 2?
	SOS	ALNGTH		;NO. DECREMENT ACCUMULATED LENGTH
	SOS	SYMCNT		;FUDGE SYMBOL COUNT FOR OUTLIN
	PUSHJ	P,OUTLIN	;OUTPUT LINE
	AOS	T2,SYMCNT	;RE-FUDGE SYMCNT
	LDB	A1,PSYML	;A1 = SYMBOL LENGTH
	ADDI	A1,1
	MOVEM	A1,ALNGTH	;UPDATE ACCUMULATED LENGTH
	LDB	A1,PSYMC	;A1 = # CHARACTERS IN SYMBOL
	ADDI	A1,4	
	IDIVI	A1,5		;A1 = # WORDS OF SYMBOL
	ADDI	A1,SYMTAB-1	;A1 = LAST LOC. TO TRANSFER TO
	MOVEI	T1,SYMTAB
	HLL	T1,SYMPNT-1(T2)	;T1 = BLT POINTER
	BLT	T1,(A1)		;MOVE SYMBOL TO START OF TABLE
	MOVE	T1,SYMPNT-1(T2)	;TRANSFER SYMBOL LENGTH
	HRRM	T1,SYMPNT
	MOVEI	T1,1
	MOVEM	T1,SYMCNT	;SYMCNT = 1
	JRST	S10
S14:	MOVEM	T3,ALNGTH	;UPDATE ACCUMULATED LENGTH
	TRZ	S,PSEOS		;SET PSEOS APPROPRIATELY
	TLNE	S,SOSM
	TRO	S,PSEOS
	JRST	S10		;CONTINUE PROCESSING
S15:	JE	" ",S17		;JUMP IF A SPACE
	JE	15,S10B		;IS IT A CRLF?
	TLNN	CC,CFC		;IS IT A FILL MODE CONTROL CHARACTER?
	JRST	S8		;NO. GET NEXT CHARACTER
	JRST	S12		;YES. ACCUMULATE SYMBOL
S16:	PUSH	P,S		;SAVE STATUS
	TLZ	S,FILLM		;SET NOFILL MODE
	PUSHJ	P,ACCUM		;ACCUMULATE SYMBOL
	POP	P,T2
	TLNE	T2,FILLM	;RESTORE VALUE FOR FILLM
	TLO	S,FILLM
	JRST	S10A		;PROCESS AND OUTPUT CENTERED OR HEADER LINE
S17:	GETC			;GET NEXT CHARACTER
	JRST	S11		;TEST IT
S18:	PUSH	P,S		;SAVE STATUS
	TLZ	S,FILLM
	PUSHJ	P,ACCUM		;ACCUMULATE PAGE PREFIX
	POP	P,T2
	TLNE	T2,FILLM	;RESTORE VALUE FOR FILLM
	TLO	S,FILLM
	MOVE	T2,SYMCNT	;T2 = SYMBOL INDEX
	LDB	CNT,PSYMC	;CNT = # CHARACTERS IN PREFIX
	HRRM	CNT,PPWRD
	LDB	T1,PSYML	;T1 = LENGTH OF PREFIX
	HRLM	T1,PPWRD
	MOVE	T1,[POINT 7,PPBUF]
	HRLI	PNT,<POINT 7,0>/1B17
	HLR	PNT,SYMPNT-1(T2)
	ILDB	T3,PNT		;STORE PAGE PREFIX
	IDPB	T3,T1
	SOJG	CNT,.-2
	SOS	SYMCNT		;DE-ALLOCATE SYMBOL
	JRST	S1		;CONTINUE WITH NEXT LINE
OUTLIN:	TLZN	S,HEADL		;IS LINE A HEADING LINE?
	JRST	OUTL3		;NO. JUMP
	MOVE	PNT,[POINT 7,HEADBF]
	LDB	A1,[POINT 9,SYMPNT,35]
	TLZN	S,CENTRL	;SHOULD HEADING BE CENTERED?
	JRST	OUTL2		;NO. SKIP
	MOVE	T1,LINEL	;T1 = LINE LENGTH
	TLNE	S,DENTM		;INDENT NEXT LINE?
	ADD	T1,DENT		;YES. ADJUST FOR INDENTATION
	SUB	T1,A1		;T1 = LINE LENGTH - SYMBOL LENGTH
	ASH	T1,-1		;T1 = T1/2
OUTL1:	JUMPLE	T1,OUTL2	;JUMP IF NO SPACES
	MOVEI	T3," "		;T3 = SPACE
	IDPB	T3,PNT		;STORE A SPACE
	SOJG	T1,.-1		;STORE REMAINING SPACES
OUTL2:	MOVE	T1,[POINT 7,SYMTAB]
	LDB	A1,[POINT 9,SYMPNT,26]
	ILDB	T3,T1		;STORE HEADING
	IDPB	T3,PNT
	SOJG	A1,.-2
	SETZ	T3,
	IDPB	T3,PNT		;STORE TERMINATING NULL
	POPJ	P,		;EXIT
OUTL3:	PUSH	P,C		;SAVE C
OUTL3A:	SKIPE	A1,LINENO	;ARE WE AT TOP OF PAGE?
	JRST	OUTL9		;NO. CONTINUE
	TRZN	S,OFIGSW	;YES. SHOULD WE OUTPUT A FIGURE?
	JRST	OUTL3D		;NONE TO OUTPUT, JUMP
	SKIPA	PNT,FSIPNT	;YES. PNT = POINTER
OUTL3B:	OUTC			;OUTPUT CHARACTER
OUT3B1:	ILDB	C,PNT		;GET NEXT CHARACTER TO OUTPUT
	JUMPN	C,OUTL3B	;STOP IF NULL
	SOSLE	SKPCNT		;ARE WE STILL SKIPPING PAGES?
	JRST	OUT3B2		;YES. PROCESS NEXT FIGURE
	PUSH	P,PNT		;NO. SAVE PNT
	TLNE	S,STOPM		;SHOULD WE STOP AFTER EACH PAGE?
	PUSHJ	P,RUN4		;YES
	POP	P,PNT		;RESTORE PNT
OUT3B2:	SOSL	FIGCNT		;ANY FIGURES LEFT?
	JRST	OUT3B1		;YES. PROCESS THEM
OUTL3C:	MOVE	CNT,PAGESV
	MOVEM	CNT,PAGENO	;RESTORE PAGE NUMBER
OUTL3D:	TRNN	S,FIGM		;ARE WE PROCESSING A FIGURE?
	JRST	OUTL3E		;NO. SKIP
	TRCE	S,FIGFF		;YES. ARE WE AT 2ND TOP MARGIN?
	JRST	OUTL18		;YES. EXIT
OUTL3E:	MOVE	A2,TOPMRG	;A2 = TOP MARGIN
	LSHC	A2,-1		;A2 = TOP MARGIN / 2
	SKIPL	A3
	SUBI	A2,1
	JUMPLE	A2,OUTL4	;OUTPUT UPPER PART OF TOP MARGIN
	OUTLF			;OUTPUT A LF
	SOJG	A2,.-1		;OUTPUT REMAINING LF'S
OUTL4:	JNM	HEADM,OUTL6	;JUMP IF NO HEADING TO OUTPUT
	MOVE	CNT,LFTMRG	;OUTPUT LEFT MARGIN
	JUMPE	CNT,.+3
	OUTSP
	SOJG	CNT,.-1
	MOVE	PNT,[POINT 7,HEADBF]
OUTL5:	ILDB	C,PNT		;OUTPUT HEADING
	JUMPE	C,OUTL5A	;JUMP IF NO MORE HEADING
	OUTC			;OUTPUT HEADING CHARACTER
	JRST	OUTL5
OUTL5A:	MOVEI	C,15
	OUTC			;OUTPUT A CR
	JRST	OUTL7		;CONTINUE
OUTL6:	JNM	PNTOP,OUTL7	;JUMP IF NO PAGE NUMBERS AT TOP
	PUSHJ	P,OUTPGN	;OUTPUT PAGE NUMBER
	JRST	OUTL8		;CONTINUE
OUTL7:	OUTLF			;OUTPUT A LF INSTEAD OF PAGE NUMBER
OUTL8:	MOVE	A2,TOPMRG	;OUTPUT BOTTOM PART OF TOP MARGIN
	MOVEM	A2,LINENO	;SET LINE POSITION
	LSH	A2,-1
	JUMPE	A2,OUTL9
	OUTLF
	SOJG	A2,.-1
OUTL9:	JM	NPAGEM!SPACEM,OUTL24  ;JUMP IF NEW PAGE OR SPACING
OUTL9A:	SKIPG	SYMCNT		;ANY SYMBOLS TO OUTPUT?
	JRST	OUTL18		;NO. EXIT
	MOVE	CNT,LFTMRG	;OUTPUT LEFT MARGIN
	TLNE	S,DENTM		;INDENT OR UNDENT?
	ADD	CNT,DENT	;YES. ADD INDENTATION OR UNDENTATION
	JUMPE	CNT,OUTL10
	OUTSP
	SOJG	CNT,.-1
OUTL10:	TLZN	S,CENTRL	;SHOULD LINE BE CENTERED?
	JRST	OUTL20		;NO. SKIP
	LDB	A1,[POINT 9,SYMPNT,35]
	MOVE	CNT,LINEL
	SUB	CNT,A1
	ASH	CNT,-1
	JUMPLE	CNT,OUTL11
	OUTSP
	SOJG	CNT,.-1
OUTL11:	MOVE	PNT,[POINT 7,SYMTAB]
	LDB	CNT,[POINT 9,SYMPNT,26]
	JUMPE	CNT,OUTL12
	ILDB	C,PNT
	OUTC
	SOJG	CNT,.-2
OUTL12:	PUSHJ	P,OUTPG3	;OUTPUT A CR LF
	MOVE	T1,DENT		;T1 = POSSIBLE INDENTATION
	TLZE	S,DENTM		;WAS LINE INDENTED?
	ADDM	T1,LINEL	;YES. ADJUST LINE LENGTH
	SETZM	DENT		;CLEAR INDENTATION AMOUNT
	AOS	T1,LINENO	;INCREMENT LINE NUMBER
	CAMGE	T1,BOTLIN	;IS LINE GEQ BOTTOM LINE?
	JRST	OUTL19		;NO. CONTINUE
OUTL13:	MOVE	A2,BOTMRG	;YES. A2 = BOTTOM MARGIN
	LSHC	A2,-1		;A2 = BOTTOM MARGIN / 2
	SKIPL	A3
	SUBI	A2,1
	JUMPLE	A2,OUTL14	;OUTPUT UPPER PART OF BOTTOM MARGIN
	OUTLF
	SOJG	A2,.-1		;OUTPUT REMAINING LF'S
OUTL14:	JNM	PNBOT,OUTL15	;JUMP IF NO PAGE NUMBERS AT BOTTOM
	PUSHJ	P,OUTPGN	;OUTPUT PAGE NUMBER
	JRST	OUTL16
OUTL15:	OUTLF			;OUTPUT A LF INSTEAD OF PAGE NUMBER
OUTL16:	MOVE	A2,BOTMRG	;OUTPUT LOWER PART OF BOTTOM MARGIN
	LSH	A2,-1
	JUMPE	A2,OUTL17
	OUTLF
	SOJG	A2,.-1
OUTL17:	AOS	PAGENO		;INCREMENT PAGE NUMBER
	SETZM	LINENO		;SET LINE TO TOP OF PAGE
	TRNE	S,FIGM		;ARE WE PROCESSING A FIGURE?
	JRST	OUTL18		;YES. EXIT
	SOSLE	SKPCNT		;DECREMENT PAGE SKIP COUNT
	JRST	OUTL18		;IF STILL SKIPPING, EXIT
	TLNE	S,STOPM		;SHOULD WE STOP AFTER EACH PAGE?
	PUSHJ	P,RUN4		;YES.  WAIT FOR USER RESPONSE
OUTL18:	POP	P,C		;RESTORE C
	POPJ	P,		;EXIT
OUTL19:	JNM	DSPCM,OUTL18	;JUMP IF NO DOUBLE SPACING
	OUTLF			;OUTPUT ANOTHER LF
	AOS	T1,LINENO	;INCREMENT LINE NUMBER
	CAMGE	T1,BOTLIN	;IS LINE GEQ BOTTOM MARGIN LINE?
	JRST	OUTL18		;NO.  EXIT
	JRST	OUTL13		;YES.  OUTPUT BOTTOM MARGIN
OUTL20:	TRZN	S,CENTOL	;CENTER NEXT LINE OF OUTPUT?
	JRST	OUTL21		;NO. JUMP
	MOVE	T2,LINEL	;YES. T2 = LINE LENGTH
	SUB	T2,ALNGTH
	ASH	T2,-1		;T2 = # OF CENTERING SPACES NEEDED
	SKIPA	C,[" "]
	OUTC			;OUTPUT SPACES
	SOJGE	T2,.-1
	JNM	FILLM,OUTL11	;JUMP IF NOT IN FILL MODE
OUTL21:	MOVEI	T2,1		;T2 = SYMBOL INDEX
	LDB	CNT,PSYMC	;OUTPUT 1ST SYMBOL
	MOVE	PNT,[POINT 7,SYMTAB]
	JUMPE	CNT,.+4
	ILDB	C,PNT
	OUTC
	SOJG	CNT,.-2
	ADDI	T2,1		;INCREMENT SYMBOL INDEX
	MOVE	A1,SYMCNT
	SOJLE	A1,OUTL12	;IF JUST ONE SYMBOL, EXIT
	MOVE	A2,LINEL
	SUB	A2,ALNGTH	;A2 = # OF EXTRA SPACES
	IDIV	A2,A1		;A2 = # OF SPACES/REMAINING SYMBOL
	HRLZ	A4,A3		;COMPUTE ALLOCATION PROBABILITY
	IDIV	A4,A1
OUTL22:	MOVEI	CNT,1		;SPACE AT LEAST ONE SPACE
	JNM	JUSTM,OUTL23	;JUMP IF NOT JUSTIFYING
	ADD	CNT,A2		;JUSTIFYING.  ADD EXTRA SPACING
	JUMPE	A3,OUTL23	;IF NO EXTRA SPACES, JUMP
	MOVEI	T1,1(A1)	;T1 = # SYMBOLS
	SUB	T1,T2		;T1 = # REMAINING SYMBOLS
	MOVE	C,CLASS(C)
	TLNN	C,CEST		;WAS LAST SYMBOL'S LAST CHARACTER AN EST?
	CAMN	T1,A3		;MUST WE OUTPUT A SPACE?
	AOJA	CNT,OUTL23-1	;YES. INCREMENT COUNT AND JUMP
	MOVE	A5,RMULT	;NO. GENERATE RANDOM NUMBER
	IMULB	A5,RANDOM
	CAIGE	A4,(A5)		;SHOULD WE OUTPUT A RANDOM SPACE?
	JRST	OUTL23		;NO. SKIP
	ADDI	CNT,1		;YES. INCREMENT COUNT
	SUBI	A3,1		;DECREMENT REMAINING SPACE COUNT
OUTL23:	OUTSP			;OUTPUT SPACES
	SOJG	CNT,.-1
	LDB	CNT,PSYMC	;CNT = # CHARACTERS IN SYMBOL
	JUMPE	CNT,.+6
	HRLI	PNT,<POINT 7,0>/1B17
	HLR	PNT,SYMPNT-1(T2)
	ILDB	C,PNT		;OUTPUT SYMBOL
	OUTC
	SOJG	CNT,.-2
	CAME	T2,SYMCNT	;WAS THIS THE LAST SYMBOL?
	AOJA	T2,OUTL22	;NO. OUTPUT THE NEXT ONE
	JRST	OUTL12		;YES. FINISH UP
OUTL24:	TLZE	S,SPACEM	;SPACE SOME LINES?
	MOVE	CNT,SPCNT	;YES. GET LINE COUNT
	TLZE	S,NPAGEM	;SKIP TO NEW PAGE?
	MOVE	CNT,PAPERL	;YES. USE MAXIMUM COUNT
	MOVE	T1,TOPMRG
	CAMN	T1,LINENO	;ARE WE AT TOP OF PAGE?
	JRST	OUTL9A		;YES. IGNORE SPACING
OUTL25:	OUTLF			;NO. OUTPUT LINE SPACING
	AOS	T1,LINENO	;INCREMENT LINE NUMBER
	CAML	T1,BOTLIN	;HAVE WE REACHED BOTTOM OF PAGE?
	JRST	OUTL26		;YES. SKIP
	SOJG	CNT,OUTL25	;NO. HAS COUNT RUN OUT?
	JRST	OUTL9A		;YES. CONTINUE
OUTL26:	MOVEI	T1,OUTL3A	;OUTL3A = NORMAL RETURN POINT
	TRNE	S,LPAGEM	;ARE WE OUTPUTTING THE LAST PAGE?
	MOVEI	T1,OUTL18	;YES. FUDGE RETURN POINT TO OUTL18
	PUSH	P,T1		;PUT RETURN POINT ON STACK
	PUSHJ	P,OUTL13	;OUTPUT BOTTOM MARGIN
OUTPGN:	MOVE	T1,PAGENO	;GET PAGE NUMBER IN T1
	SETZ	T3,		;CLEAR DIGIT COUNTER
OUTPG1:	IDIVI	T1,↑D10
	ADDI	T3,1		;INCREMENT DIGIT COUNT
	PUSH	P,T2		;STORE DECIMAL DIGIT
	JUMPN	T1,OUTPG1	;CONTINUE IF MORE LEFT
	MOVE	A1,ILL		;A1 = INITIAL LINE LENGTH
	TRNN	S,PPM		;PREFIX PAGE NUMBER?
	JRST	OUTP1A		;NO, SKIP
	HLRZ	A2,PPWRD	;YES, A2 = PREFIX LENGTH
	SUB	A1,A2
	JRST	OUTP1B
OUTP1A:	SUBI	A1,4(T3)	;ALLOW FOR PAGE NUMBER
OUTP1B:	LSH	A1,-1
	ADD	A1,PGBIAS	;ADD PAGE MARGIN BIAS
	OUTSP
	SOJG	A1,.-1		;OUTPUT LEADING SPACES
	TRNN	S,PPM		;PREFIX PAGE NUMBER?
	JRST	OUTP1C		;NO, SKIP
	MOVE	T1,[POINT 7,PPBUF]
	HRRZ	T2,PPWRD
	SOJL	T2,OUTPG2
	ILDB	C,T1
	OUTC
	JRST	.-3
OUTP1C:	MOVEI	C,"-"
	OUTC
	OUTSP
OUTPG2:	POP	P,C		;OUTPUT PAGE NUMBER
	ADDI	C,"0"
	OUTC
	SOJG	T3,OUTPG2
	TRNE	S,PPM		;PREFIX PAGE NUMBER?
	JRST	OUTPG3		;YES, JUMP
	OUTSP
	MOVEI	C,"-"
	OUTC
OUTPG3:	MOVEI	C,15		;OUTPUT CR LF
	OUTC
	TRNN	S,T2741
	OUTLF
	MOVEI	C,10
	TRNE	S,TTY37
	JRST	COUT
	POPJ	P,
ACCUM:	AOS	T1,SYMCNT	;INCREMENT SYMBOL COUNT
	LDB	A1,[POINT 9,SYMPNT-2(T1),26]
	ADDI	A1,4
	IDIVI	A1,5		;A1=LENGTH OF PREVIOUS SYMBOL IN WORDS
	HLRZ	SP,SYMPNT-2(T1)	;SP = ADDRESS OF PREVIOUS SYMBOL
	ADD	SP,A1		;SP = STARTING ADDRESS OF NEW SYMBOL
	HRLZM	SP,SYMPNT-1(T1)	;INITIALIZE SYMBOL POINTER
	HRLI	SP,<POINT 7,0>/1B17	;INITIALIZE BYTE POINTER
ACCUM1:	JA	ACCU10		;JUMP IF A LETTER
	JNM	FILLM,ACCUM3	;JUMP IF NOT IN FILL MODE
	TLNE	CC,CFC		;IS CHAR. A FILL MODE CONTROL CHAR.?
	JRST	ACCUM4		;YES. TAKE APPROPRIATE ACTION
	TLZ	SS,PCSPSW	;NO. RESET PREVIOUS CHARACTER A SPACE
ACCUM2:	TLNE	CC,CF		;IS CHARACTER NULL IN FILL MODE?
	PUSHJ	P,STOREC	;NO. STORE IT
	GETC			;GET NEXT CHARACTER
	JRST	ACCUM1		;CONTINUE
ACCUM3:	TLNE	CC,CNFC		;IS CHAR. A NOFILL MODE CONTROL CHAR.?
	JRST	ACCUM4		;YES
	TLNE	CC,CNF		;IS CHARACTER NULL IN NOFILL MODE?
ACCU3B:	PUSHJ	P,STOREC	;NO. STORE IT
ACCU3C:	GETC			;GET NEXT CHARACTER
	JRST	ACCUM1		;CONTINUE
ACCUM4:	JE	" ",ACCU15	;YES. JUMP IF SPACE
	JE	15,ACCU16
	TLZ	SS,PCSPSW
	JE	"↑",ACCUM6	;SPECIAL CONTROL CHARACTER
	JE	".",ACCU4A
	JE	11,ACCU11
	JE	"?",ACCU4A
	JNE	"!",ACCUM2	;IGNORE IT IF NOT A "!"
ACCU4A:	PUSHJ	P,STOREC	;STORE THE END OF SENTENCE CHARACTER
	GETC			;GET NEXT CHARACTER
	CAIN	C,15		;IS IT A CRLF?
	JRST	ACCU4B
	CAIE	C," "		;OR A " "?
	JRST	ACCUM1		;NO. NOT END OF A SENTENCE
	JM	FILLM,ACCU4B	;JUMP IF FILL MODE
	TLO	S,SOSM		;SET START OF SENTENCE
	JRST	ACCU3B		;CONTINUE
ACCU4B:	TLO	S,SOSM		;IT WAS, SET START OF SENTENCE
ACCUM5:	TLNE	S,ULINEM	;UNDERLINE SYMBOL?
	TRNN	S,TTY37!T2741	;YES. OUTPUT TO TTY 37 OR IBM 2741?
	JRST	ACCU5A		;NO. JUMP
	PUSH	P,C		;SAVE CURRENT CHARACTER
	PUSH	P,CC
	LDB	A2,[POINT 9,SYMPNT-1(T1),35] ;A2 = SYMBOL LENGTH
	MOVE	T3,A2		;COPY SYMBOL LENGTH
	MOVEI	C,10		;C = BS
	TLO	SS,DONTUL	;SET DON'T UNDERLINE SWITCH
	PUSHJ	P,STOREC	;STORE BACKSPACES
	SOJG	T3,.-1
	MOVEI	C,"←"		;C = UNDERLINE CHARACTER
	PUSHJ	P,STOREC	;STORE UNDERLINE CHARACTERS
	SOJG	A2,.-1
	TLZ	SS,DONTUL	;RESET DON'T UNDERLINE SWITCH
	POP	P,CC		;RESTORE C
	POP	P,C
ACCU5A:	TLNE	S,SOSM		;WAS SYMBOL END OF SENTENCE?
	TLNN	S,FILLM		;YES. IN FILL MODE?
	POPJ	P,		;NO. EXIT
	MOVE	T3,ALNGTH	;YES. T3 = ACCUMULATED LENGTH
	LDB	T2,[POINT 9,SYMPNT-1(T1),35] ;T2 = SYMBOL LENGTH
	ADD	T3,T2		;T3 = SYMBOL LENGTH + ACCUMULATED LENGTH
	MOVEI	T2,1(T3)	;T2 = (T3) + 1
	CAME	T2,LINEL	;DO WE HAVE TO DO SPECIAL FUDGE?
	JRST	.+3		;NO. JUMP
	TRO	S,PSEOS		;YES. SET PSEOS BIT
	JRST	.+3		;JUMP TO ADD A SPACE
	CAMN	T3,LINEL	;IS (T3) = LINE LENGTH?
	JRST	ACCU5B		;YES. DON'T ADD AN EXTRA SPACE
	MOVEI	T2," "		;NO. ADD AN EXTRA SPACE AFTER SYMBOL
	IDPB	T2,SP
	MOVEI	T2,1001		;INCREMENT SYMBOL LENGTH
	ADDM	T2,SYMPNT-1(T1)
ACCU5B:	POPJ	P,		;EXIT

ACCUM6:	GETC			;GET NEXT CHARACTER
	JE	"↑",ACCUM2	;TREAT "↑↑" AS "↑"
	JN	ACCUM8		;JUMP IF NUMBER
	JA	ACCUM7		;JUMP IF ALPHABETIC
	JE	"-",ACCU6A
	JE	"←",ACCU6C
	PUSH	P,C		;SAVE CHARACTER
	MOVEI	C,"↑"
	PUSHJ	P,STOREC	;STORE A "↑"
	POP	P,C		;RESTORE CHARACTER
	JRST	ACCUM1		;CONTINUE
ACCU6A:	TRC	S,UCS		;COMPLEMENT UPPER CASE SHIFT BIT
ACCU6B:	GETC			;GET NEXT CHARACTER
	JRST	ACCUM1		;CONTINUE PROCESSING
ACCU6C:	TRNE	S,TTY37!T2741	;CAN DEVICE DO UNDERLINING?
	TRC	S,ULS		;YES. COMPLEMENT UNDERLINE SHIFT BIT
	JRST	ACCU6B		;CONTINUE
ACCUM7:	TLZ	S,SOSM		;RESET START OF SENTENCE MODE
	ANDI	C,137		;CAPITALIZE LETTER
	JRST	ACCUM2		;CONTINUE
ACCUM8:	MOVEI	A1,-"0"(C)	;A1 = VALUE OF 1ST DIGIT
	GETC			;GET NEXT CHARACTER
	JNN	ACCUM9		;JUMP IF NOT NUMERIC
	LSH	A1,3		;DO MULTIPLY BY 8
	ADDI	A1,-"0"(C)	;ACCUMULATE 2ND OCTAL DIGIT
	GETC
	JNN	ACCUM9		;JUMP IF NOT NUMERIC
	LSH	A1,3
	ADDI	A1,-"0"(C)	;ACCUMULATE 3RD OCTAL DIGIT
	GETC
ACCUM9:	PUSH	P,C		;SAVE TERMINATING CHARACTER
	CAIL	A1,200		;IS VALUE WITHIN RANGE?
	MOVEI	A1,"?"		;NO. CHANGE IT TO A "?"
	MOVE	C,CLASS(A1)
	TRNE	S,LP10E		;OUTPUT TO A LP10E PRINTER?
	TLNN	C,CLPEH		;YES. IS CHARACTER A HIDDEN ONE?
	JRST	ACCM9A		;NO. CONTINUE
	MOVEI	C,177		;YES. PREFIX IT WITH A DELETE
	IDPB	C,SP
	IDPB	A1,SP		;STORE HIDDEN CHARACTER
	MOVEI	A1,2001
	ADDM	A1,SYMPNT-1(T1)	;INCREMENT SYMBOL LENGTH
	JRST	ACCM9B		;CONTINUE
ACCM9A:	MOVE	C,A1		;GET SPECIAL CODE
	PUSHJ	P,STOREC	;OUTPUT IT
ACCM9B:	POP	P,C		;RESTORE CHARACTER
	JRST	ACCUM1		;CONTINUE
ACCU10:	TLZ	SS,PCSPSW	;RESET PREVIOUS CHARACTER A SPACE
	TLNE	S,LOWCM		;LOWER CASE MODE?
	ORI	C,40		;YES. CONVERT TO LOWER CASE
	TDNE	S,[UCM,,UCS]	;UPPER CASE MODE OR UPPER CASE SHIFT?
	ANDI	C,137		;YES. CONVERT TO UPPER CASE
	TLZE	S,SOSM		;START OF SENTENCE MODE?
	TLNN	S,CAPSM		;YES. CAPITALIZE SENTENCES?
	JRST	ACCUM2		;NO. STORE IT
	ANDI	C,137		;YES. CONVERT TO UPPER CASE
	JRST	ACCUM2		;STORE IT
ACCU11:	JNM	FILLM,ACCU12	;JUMP IF NOFILL MODE
	JM	JUSTM,ACCU14	;JUMP IF FILL AND JUSTIFY MODES
ACCU12:	LDB	C,[POINT 9,SYMPNT-1(T1),35]
	ADD	C,ALNGTH	;C = CURRENT LINE POSITION
	MOVEI	CC,1		;INITIALIZE TAB SPACE COUNT
ACCU13:	ADDI	C,1		;DO TAB SIMULATION
	CAMGE	C,LINEL
	SKIPE	TABTBL+1(C)
	JRST	.+2
	AOJA	CC,ACCU13
	MOVEI	C," "		;STORE NECESSARY SPACES
	PUSHJ	P,STOREC
	SOJG	CC,.-1
	JRST	ACCU3C
ACCU14:	MOVEI	C," "		;TREAT TAB AS A SPACE IN JUSTIFY MODE
	MOVE	CC,CLASS+" "
	JRST	ACCUM1
ACCU15:	TLO	SS,PCSPSW	;SET PREVIOUS CHARACTER A SPACE
	JRST	ACCUM5		;CONTINUE
ACCU16:	TLZN	SS,PCSPSW	;WAS PREVIOUS CHARACTER NOT A SPACE?
	TLNN	SS,SSALSW	;YES. SPLIT SYMBOLS ACROSS LINES?
	JRST	ACCUM5		;NO. CONTINUE NORMALLY
	JNM	FILLM,ACCUM5	;IGNORE SPECIAL PROCESSING IF NOFILL
	GETC			;GOBBLE CRLF
	JRST	ACCUM1		;CONTINUE PROCESSING

STOREC:	IDPB	C,SP		;STORE CHARACTER IN SYMBOL
	LDB	A1,[POINT 2,CLASS(C),14]
	ADDI	A1,1000-1
	TRNN	S,ULS		;UNDERLINE SHIFT?
	JRST	STORE1		;NO. JUMP
	TRNE	S,TTY37!T2741	;YES. TTY37 OR IBM2741?
	TLNE	SS,DONTUL	;YES. CAN WE UNDERLINE?
	JRST	STORE1		;NO. JUMP
	PUSH	P,C		;YES. UNDERLINE CHARACTER
	MOVEI	C,10
	IDPB	C,SP
	MOVEI	C,"←"
	IDPB	C,SP
	ADDI	A1,2000		;UPDATE SYMBOL CHARACTER COUNT
	POP	P,C		;RESTORE C
STORE1:	ADDM	A1,SYMPNT-1(T1)	;UPDATE SYMBOL LENGTH
	POPJ	P,		;EXIT
;	GET:	<DEVICE>:<FILE>.<EXT>[<PROJECT>,<PROGRAMMER>]
;
;		PUSHJ	P,GFILE
;
;	RETURN:	A1= SIXBIT /<DEVICE>/
;		A2= SIXBIT /<FILE>/
;		A3= SIXBIT /<EXT>/
;		A4= XWD <PROJECT>,<PROGRAMMER>
;		C = DELIMITER

GFILE:	SETZB	A1,A2		;CLEAR ACCUMULATORS
	SETZB	A3,A4
	MOVEI	CNT,6
	MOVE	PNT,[POINT 6,A1]
	PUSHJ	P,GSIXB		;GET POSSIBLE DEVICE NAME
	CAIE	C,":"		;WAS IT REALLY THE DEVICE NAME?
	JRST	GFILE3		;NO. MUST BE FILE NAME
	MOVEI	CNT,6		;YES. PROCESS FILE NAME
	MOVE	PNT,[POINT 6,A2]
	PUSHJ	P,GSIXB		;GET FILE NAME
GFILE1:	CAIE	C,"."		;ANY EXTENSION?
	JRST	GFILE2		;NO. SKIP EXTENSION SCAN
	MOVEI	A3,-1		;YES. SET EXTENSION SPECIFIED
	MOVEI	CNT,3
	MOVE	PNT,[POINT 6,A3]
	PUSHJ	P,GSIXB		;GET FILE EXTENSION
GFILE2:	CAIE	C,"["		;DIRECTORY SPECIFIED?
	POPJ	P,		;NO. EXIT
	PUSHJ	P,OCTIN		;GET PROJECT #
	CAIE	C,","		;DELIMITER A ","?
	JRST	SPECER		;NO. ERROR
	HRL	A4,T2		;STORE PROJECT #
	PUSHJ	P,OCTIN		;GET PROGRAMMER #
	CAIE	C,"]"		;DELIMITER A "]"?
	JRST	SPECER		;NO. ERROR
	HRR	A4,T2		;YES. STORE PROGRAMMER #
	GET			;GET NEXT DELIMITER
	POPJ	P,		;EXIT
GFILE3:	EXCH	A1,A2		;EXCHANGE DEVICE AND FILE NAMES
	JRST	GFILE1		;CONTINUE
;	GET SIXBIT NAME
;
;		MOVEI	CNT,<MAX CHARACTER COUNT>
;		MOVE	PNT,[BYTE POINTER]
;		PUSHJ	P,GSIXB
;
;	RETURNS	C = DELIMITER
;		NAME STORED IN AREA POINTED TO BY [BYTE POINTER]

GSIXB0:	SUBI	C,40		;CONVERT TO SIXBIT CODE
	SOJL	CNT,GSIXB	;CHECK COUNT
	IDPB	C,PNT		;STORE IT
GSIXB:	GET			;GET CHARACTER IN C
	CAIG	C,"9"		;IS IT A NUMBER?
	CAIGE	C,"0"
	JRST	GSIXB1		;NO
	JRST	GSIXB0		;YES
GSIXB1:	CAIG	C,"Z"		;IS IT AN UPPER CASE LETTER?
	CAIGE	C,"A"
	JRST	GSIXB2		;NO
	JRST	GSIXB0		;YES
GSIXB2:	CAIG	C,"Z"+40	;IS IT A LOWER CASE LETTER?
	CAIGE	C,"A"+40
	POPJ	P,		;NO. EXIT
	SUBI	C,40		;YES. CHANGE IT TO UPPER CASE
	JRST	GSIXB0


;	GET OCTAL (DECIMAL) NUMBER IN T2

OCTIN:	SKIPA	T1,[↑D8]	;OCTAL INPUT
DECIN:	MOVEI	T1,↑D10		;DECIMAL INPUT
	MOVEI	T2,0
DECIN1:	GET			;GET CHARACTER
	CAIG	C,"0"-1(T1)	;IS IT A LEGAL NUMBER?
	CAIGE	C,"0"
	POPJ	P,		;NO. EXIT
	IMUL	T2,T1		;YES. ACCUMULATE THIS NUMBER
	ADDI	T2,-"0"(C)
	JRST	DECIN1		;PROCESS NEXT NUMBER
;	OUTPUT ROUTINE

COUTLF:	SKIPA	C,LFCHR		;OUTPUT A LF
COUTSP:	MOVEI	C," "		;OUTPUT A SPACE
COUT:	TRNE	S,FIGM		;ARE WE PROCESSING A FIGURE?
	JRST	COUT4		;YES. TAKE SPECIAL ACTION
	SKIPLE	SKPCNT		;ARE WE IN SKIP MODE?
	POPJ	P,		;YES. IGNORE OUTPUT
COUT0:	CAIE	C,11		;TAB BEING OUTPUT?
	JRST	COUT00		;NO. SKIP
	PUSH	P,C		;YES. SAVE C, CC
	PUSH	P,CC
	MOVE	CC,HPOS		;CC = HORIZONTAL POSITION
	SUB	CC,LFTMRG	;SUBTRACT LEFT MARGIN VALUE
	ANDI	CC,7		;CC = MOD(CC,8)
	SUBI	CC,↑D8		;CC = - SPACES NEEDED TO SIMULATE TAB
	MOVEM	CC,SPCTR	;SAVE NEGATIVE COUNT
	MOVEI	C," "
	MOVE	CC,CLASS+" "
	PUSHJ	P,COUT		;OUTPUT SPACES
	AOSGE	SPCTR
	JRST	.-2
	JRST	COUT1B		;FINISHED. EXIT
COUT00:	PUSH	P,CC		;SAVE CC
	LDB	CC,[POINT 2,CLASS(C),14] ;CC = LENGTH BITS
	SUBI	CC,1
	ADDM	CC,HPOS		;ADJUST HORIZONTAL POSITION
	POP	P,CC		;RESTORE CC
	TRNN	S,T2741		;OUTPUTTING TO IBM 2741?
	JRST	COUT1		;NO. JUMP
	PUSH	P,C		;YES. SAVE C
	PUSH	P,CC		;SAVE CC
COUT01:	MOVE	CC,@P2741	;CC = 2741 CHARACTER INFO
	TRNN	CC,1B18		;IS CHARACTER UPPER CASE?
	JRST	COUT0A		;NO. JUMP
	TLNE	SS,UCSHF	;YES. IS 2741 IN UPPER CASE?
	JRST	COUT0C		;YES. DON'T HAVE TO SWITCH TO UPPER CASE
	MOVEI	C,SHFTUC	;C = UPPER CASE SHIFT CODE
	JRST	COUT0B		;OUTPUT IT, AND CONTINUE
COUT0A:	TRNE	CC,1B19		;IS CHARACTER LOWER CASE?
	TLNN	SS,UCSHF	;YES. IS 2741 IN LOWER CASE?
	JRST	COUT0C		;DON'T HAVE TO SWITCH
	MOVEI	C,SHFTLC	;NO. C = LOWER CASE SHIFT CODE
COUT0B:	PUSHJ	P,COUT2		;OUTPUT CASE SHIFT CODE
	TLC	SS,UCSHF	;COMPLEMENT SHIFT BIT
COUT0C:	MOVE	C,CC		;C = CHARACTER TO BE OUTPUT
	PUSHJ	P,COUT2		;OUTPUT IT
	TLZN	CC,4		;OUTPUTING "!"?
	JRST	COUT0D		;NO. JUMP
	MOVEI	C,BKSPC		;YES. OUTPUT BACKSPACE
	PUSHJ	P,COUT2
	MOVEI	C,"."		;OUTPUT A "."
	JRST	COUT01
COUT0D:	HLRZS	CC		;CC = IDLE CHARACTER COUNT
	CAIG	CC,1		;MORE THAN 1 IDLE?
	JRST	COUT0E		;NO. JUMP
	MOVE	C,HPOS		;YES. ASSUME CARRIAGE RETURN
	IDIVI	C,↑D10		;COMPUTE IDLE COUNT
	MOVEI	CC,2(C)
	SETZM	HPOS		;RESET HORIZONTAL POSITION
COUT0E:	SOJGE	CC,COUT0F	;DECREMENT COUNT, ANY LEFT?
	POP	P,CC		;NO. RESTORE CC
	POP	P,C		;RESTORE C
	POPJ	P,		;EXIT
COUT0F:	MOVEI	C,IDLEC		;C = IDLE CHARACTER
	PUSHJ	P,COUT2		;OUTPUT IT
	JRST	COUT0E		;GO BACK FOR MORE
COUT1:	CAIN	C,15		;CARRIAGE RETURN?
	SETZM	HPOS		;YES. RESET HORIZONTAL POSITION
	PUSHJ	P,COUT2		;OUTPUT C
	TRNN	S,CRSW!SLWSW	;ANY SPECIAL PROCESSING?
	POPJ	P,		;NO. EXIT
	PUSH	P,C		;SAVE C
	PUSH	P,CC		;SAVE CC IN CASE SOMEONE USING IT
	TRNN	S,CRSW		;CARRIAGE RETURN PROCESSING?
	JRST	COUT1D		;NO. CONTINUE
	CAIE	C,12		;YES. IS CHARACTER A LINE FEED?
	JRST	COUT1C		;NO. CONTINUE
	MOVEI	C,15		;YES. SEND OUT EXTRA CARRIAGE RETURNS
	MOVE	CC,CRCNT	;CC HAS COUNT
COUT1A:	PUSHJ	P,COUT6		;DO IT
COUT1B:	POP	P,CC		;RESTORE CC
	POP	P,C		;RESTORE C
	POPJ	P,		;EXIT
COUT1C:	TRNN	S,SLWSW		;SLOW MODE?
	JRST	COUT1B		;NO. EXIT
COUT1D:	MOVEI	C,37		;YES. SEND OUT UNIT SEPARATORS
	MOVE	CC,SLWCNT	;CC HAS COUNT
	JRST	COUT1A		;DO IT
COUT6:	SOSGE	@OPNT+2		;INCREMENT BYTE COUNT
	JRST	COUT6A		;NO MORE SPACE IN BUFFER
	IDPB	C,@OPNT+1	;DEPOSIT CHARACTER IN BUFFER
	SOJG	CC,COUT6	;DECREMENT COUNT AND LOOP BACK
	POPJ	P,		;FINISHED.  EXIT
COUT6A:	XCT	OPNT		;OUTPUT THE BUFFER
	JRST	COUT6		;OUTPUT OKAY, STORE CHARACTER
	JRST	COUT3		;OUTPUT ERROR
COUT2:	SOSGE	@OPNT+2		;INCREMENT ITEM COUNT
	JRST	COUT2B		;NONE LEFT, JUMP
COUT2A:	IDPB	C,@OPNT+1	;STORE CHARACTER IN BUFFER
	POPJ	P,		;EXIT
COUT2B:	XCT	OPNT		;OUTPUT FILLED BUFFER
	JRST	COUT2		;RETURN TO STORE CHARACTER
COUT3:	MOVEI	PNT,[ASCIZ /Output error!/]
	JRST	ERRTYP
COUT4:	SOSGE	FSCNT		;HAVE WE RUN OUT OF SPACE YET?
	JRST	COUT5		;YES. GET SOME MORE
COUT4A:	IDPB	C,FSPNT		;NO. STORE CHARACTER
	POPJ	P,		;EXIT
COUT5:	PUSH	P,T1		;SAVE T1
	HRRZ	T1,JOBREL
	ADDI	T1,2000
	CALLI	T1,CORE		;GET ANOTHER K OF CORE
	HALT	.
	MOVEI	T1,11777
	MOVEM	T1,FSCNT	;COMPUTE NEW COUNT
	POP	P,T1		;RESTORE T1
	JRST	COUT4A		;CONTINUE
;	INPUT ROUTINE

CIN:	TLNN	SS,ODLYSP	;OUTPUT DELAYED SPACES?
	JRST	CIN0		;NO. SKIP
	SOSGE	DLYSCT		;DECREMENT DELAYED SPACES COUNT
	JRST	CIN7		;NONE LEFT, JUMP
	MOVEI	C," "		;TRANSMIT A SPACE
	JRST	CIN1A
CIN0:	SOSGE	@IPNT+2		;DECREMENT BYTE COUNT
	JRST	CIN2		;NO MORE CHARACTERS IN THIS BUFFER
CIN1:	ILDB	C,@IPNT+1	;GET NEXT CHARACTER
	JUMPE	C,CIN		;IGNORE NULS
	TLNE	SS,CARDIN	;INPUT FROM CARDS?
	JRST	CIN5		;YES. TAKE SPECIAL ACTION
CIN1A:	MOVE	CC,CLASS(C)	;CC = CHARACTER CLASS WORD
	CAIE	C,15		;CR?
	POPJ	P,		;EXIT
	PUSHJ	P,CIN		;GOBBLE UP LF
	MOVEI	C,15
	MOVE	CC,CLASS(C)	;CC = CHARACTER CLASS WORD
	POPJ	P,
CIN2:	XCT	IPNT		;INPUT BUFFER
	JRST	CIN		;INPUT OKAY, CONTINUE
CIN3:	XCT	IPNT+3		;CHECK STATUS
	JRST	CIN4		;ERROR
	JRST	CINEOF		;EOF
CIN4:	MOVEI	PNT,[ASCIZ /Input error!/]
	JRST	ERRTYP
CIN5:	JM	FILLM,CIN1A	;DO NOTHING SPECIAL IF IN FILL MODE
	CAIE	C," "		;DO WE HAVE A SPACE?
	JRST	CIN6		;NO. SKIP
	TLON	SS,DLYSPC	;YES. ALREADY SOME DELAYED?
	SETZM	DLYSCT		;NO. INITIALIZE COUNTER
	AOS	DLYSCT		;INCREMENT DELAYED SPACE COUNT
	JRST	CIN		;GET NEXT CHARACTER
CIN6:	TLZE	SS,DLYSPC	;ANY DELAYED SPACES?
	CAIN	C,15		;YES. NOT END OF LINE?
	JRST	CIN1A		;NO. TAKE NO SPECIAL ACTION
	TLO	SS,ODLYSP	;YES. SET TO OUTPUT DELAYED SPACES
	MOVEM	C,CSAVE		;SAVE CURRENT CHARACTER
	JRST	CIN		;DO IT
CIN7:	MOVE	C,CSAVE		;RESTORE SAVED CHARACTER
	TLZ	SS,ODLYSP	;RESET OUTPUT DELAYED SPACES MODE
	JRST	CIN1A		;TRANSMIT CHARACTER
CINEOF:	PUSHJ	P,BRKCOM	;BREAK OFF PREVIOUS LINE
	TLO	S,NPAGEM	;SET SKIP TO NEW PAGE MODE
	TRO	S,LPAGEM	;SET LAST PAGE MODE
	PUSHJ	P,OUTLIN	;OUTPUT REMAINDER OF LAST PAGE
	RELEAS	OUT,		;RELEASE OUTPUT CHANNEL
	RELEAS	TTY,
	JRST	RUNOFF		;PROCESS NEXT FILE
;	TYPE STRING ROUTINE

TYPEIT:	ILDB	C,PNT		;GET NEXT CHARACTER
	JUMPE	C,TYPE2		;EXIT ON ZERO CHARACTER
	SOSG	TTYO+2		;HAVE WE EXCEEDED THE BUFFER?
	OUTPUT	TTY,		;YES. OUTPUT THE BUFFER
TYPE1:	IDPB	C,TTYO+1	;STORE CHARACTER IN BUFFER
	JRST	TYPEIT		;PROCESS NEXT CHARACTER
TYPE2:	OUTPUT	TTY,		;CLOSE OUT BUFFER
	POPJ	P,		;EXIT


;	INPUT A CHARACTER

GETIT:	SOSGE	TTYI+2		;ANY MORE CHARACTERS IN BUFFER?
	INPUT	TTY,		;NO. GET A NEW BUFFER
GET1:	ILDB	C,TTYI+1	;GET CHARACTER IN C
	JUMPE	C,GETIT		;IGNORE NUL
	CAIE	C,15
	POPJ	P,		;EXIT
	PUSHJ	P,GETIT		;GOBBLE UP LF
	MOVEI	C,15
	POPJ	P,		;EXIT
;	TABLE OF DIRECT COMMANDS TO RUNOFF

CMTBL:	SIXBIT	"BALL"		;INDICATE BALL TYPE ON IBM2741
	SIXBIT	"BM"		;SET BOTTOM MARGIN
	SIXBIT	"CARDIN"	;CARD INPUT MODE
	SIXBIT	"CR"		;FORCE CARRIAGE RETURN
	SIXBIT	"DONE"		;STOP PROCESSING AND EXIT TO MONITOR
	SIXBIT	"LL"		;SET LINE LENGTH
	SIXBIT	"LM"		;SET LEFT MARGIN
	SIXBIT	"LP10"		;OUTPUT TO REGULAR 64 CHARACTER LINE PRINTER
	SIXBIT	"LP10E"		;OUTPUT IN FULL ASCII ON LP10E PRINTER
	SIXBIT	"NOSTOP"	;SET MODE TO NOT STOP AFTER EACH PAGE
	SIXBIT	"PL"		;SET PAGE LENGTH
	SIXBIT	"SKIP"		;SKIP SPECIFIED NUMBER OF PAGES
	SIXBIT	"SLOW"		;SLOW DOWN OUTPUT OF EACH CHARACTER
	SIXBIT	"SSAL"		;SPLIT SYMBOLS ACROSS LINES
	SIXBIT	"TM"		;SET TOP MARGIN
	SIXBIT	"TTY33"		;OUTPUT IN MODEL 33 TELETYPE CHARACTER SET
	SIXBIT	"TTY37"		;OUTPUT IN MODEL 37 TELETYPE CHARACTER SET
	SIXBIT	" "		;CONTINUE PROCESSING

CTL=.-CMTBL


;	DIRECT COMMAND DISPATCH TABLE

CMTBLR:	BALCOM
	BMCOM
	CRDICM
	CRCOM
	DONCOM
	LLCOM
	LMCOM
	LPCOM
	LPECOM
	NSTCOM
	PLCOM
	SKPCOM
	SLWCOM
	SSALCM
	TMCOM
	T33COM
	T37COM
	CNTCOM
;	DONE<CRLF>

DONCOM:	RELEASE	IN,		;CLOSE AND RELEASE CHANNELS
	RELEASE	OUT,
	RELEASE	TTY,
	CALLI	EXIT		;EXIT TO MONITOR


;	NOSTOP<CRLF>

NSTCOM:	TLZ	S,STOPM		;CLEAR STOP MODE BIT
	POPJ	P,


;	SSAL<CRLF>

SSALCM:	TLO	SS,SSALSW	;SET SPLIT SYMBOLS ACROSS LINES MODE
	POPJ	P,


;	CARDIN<CRLF>

CRDICM:	TLO	SS,CARDIN	;SET CARD INPUT MODE
	POPJ	P,
;	SKIP <N><CRLF>

SKPCOM:	MOVEI	T1,1		;ASSUME COUNT OF 1
	MOVEM	T1,SKPCNT
	CAIN	C,15		;CR?
	POPJ	P,		;YES
	PUSHJ	P,GETNUM	;NO. GET <N>
	MOVEM	T2,SKPCNT	;STORE PAGE SKIP COUNT
	POPJ	P,


;	<CRLF>

CNTCOM:	CAIE	C,15		;IS DELIMITER A CR?
	JRST	COMER		;NO, ERROR
	POP	P,T1
	POPJ	P,		;CONTINUE PROCESSING


;	LP10<CRLF>

LPCOM:	TRZ	S,TTY33!TTY37!LP10E
	TRO	S,LP10
LPCOM1:	MOVEI	T1,23		;T1 = DC3
	MOVEM	T1,LFCHR
	POPJ	P,		;EXIT


;	LP10E<CRLF>

LPECOM:	TRZ	S,TTY33!TTY37!LP10
	TRO	S,LP10E
	JRST	LPCOM1


;	BM <N><CRLF>

BMCOM:	PUSHJ	P,GETNUM	;GET BOTTOM MARGIN
	JRST	BMRCOM		;STORE IT


;	LL <N><CRLF>

LLCOM:	PUSHJ	P,GETNUM	;GET LINE LENGTH
	CAILE	T2,MAXLL	;DOES IT EXCEED MAXIMUM?
	JRST	LLCOM1		;YES, ERROR
	MOVEM	T2,LINEL	;NO, STORE IT
	POPJ	P,
LLCOM1:	TYPE	[ASCIZ /Line length is too long!/]
	TYPE	CRLF
	JRST	COMER
;	LM <N><CRLF>

LMCOM:	PUSHJ	P,GETNUM	;GET LEFT MARGIN
	MOVEM	T2,LFTMRG	;STORE IT
	POPJ	P,		;EXIT


;	PL <N><CRLF>

PLCOM:	PUSHJ	P,GETNUM	;GET PAGE LENGTH
	JRST	PRLCOM		;STORE IT


;	TM <N><CRLF>

TMCOM:	PUSHJ	P,GETNUM	;GET TOP MARGIN
	JRST	TMRCOM		;STORE IT


;	TTY33<CRLF>

T33COM:	TRZ	S,LP10!LP10E!TTY37
	TRO	S,TTY33		;OUTPUT IN TTY 33 CHARACTER SET
	JRST	T37CM1


;	TTY37<CRLF>

T37COM:	TRZ	S,LP10!LP10E!TTY33
	TRO	S,TTY37		;OUTPUT IN TTY 37 CHARACTER SET
T37CM1:	MOVEI	T1,12
	MOVEM	T1,LFCHR
	POPJ	P,		;EXIT


;	CR <N><CRLF>

CRCOM:	TRZ	S,CRSW		;RESET SWITCH
	CAIN	C,15		;ANY ARGUMENT?
	POPJ	P,		;NO. EXIT
	PUSHJ	P,GETNUM	;YES. GET IT
	JUMPE	T2,CRCOM	;IF 0, RESET SWITCH
	TRO	S,CRSW		;SET SWITCH
	MOVEM	T2,CRCNT	;STORE CARRIAGE RETURN COUNT
	POPJ	P,		;EXIT
;	SLOW <N><CRLF>

SLWCOM:	TRZ	S,SLWSW		;RESET SWITCH
	CAIN	C,15		;ANY ARGUMENT?
	POPJ	P,		;NO. EXIT
	PUSHJ	P,GETNUM	;YES. GET IT
	JUMPE	T2,SLWCOM	;IF 0, RESET SWITCH
	TRO	S,SLWSW		;SET SWITCH
	MOVEM	T2,SLWCNT	;STORE DELAY COUNT
	POPJ	P,		;EXIT


;	BALL <N><CRLF>

BALCOM:	CAIN	C,15		;ANY ARGUMENT?
	POPJ	P,		;NO. EXIT
	PUSHJ	P,GETNUM	;YES. GET ARGUMENT IN T2
	CAIG	T2,N2741	;BALL # TOO GREAT?
	SOSGE	T2		; OR TOO SMALL?
	POPJ	P,		;YES. EXIT
	MOVE	T2,TB2741(T2)	;NO. STORE POINTER TO TRANSLATION TABLE
	HRRM	T2,P2741
	POPJ	P,		;EXIT



GETNUM:	CAIE	C," "		;SHOULD BE A SPACE SEPARATOR
	JRST	COMER0		;NOT THERE, ERROR
	PUSHJ	P,DECIN		;GET NUMBER IN T2
	CAIE	C,15		;IS DELIMITER A CR?
	JRST	COMER0		;NO. ERROR
	MOVEM	T2,NUMARG	;YES. STORE NUMERIC ARGUMENT
	POPJ	P,		;EXIT
;	TRANSLATION TABLE: ASCII TO IBM 2741 (JOSS)

	DEFINE	JOSS(ASCII,D),<
IF2,<
	XLIST
BC=0
BB=0
BA=0
B8=0
B4=0
B2=0
B1=0
BLC=0
BUC=0
BIC=0
	IRP	D<
IFIDN <D> <C>,<BC=1>
IFIDN <D> <B>,<BB=1>
IFIDN <D> <A>,<BA=1>
IFIDN <D> <8>,<B8=1>
IFIDN <D> <4>,<B4=1>
IFIDN <D> <2>,<B2=1>
IFIDN <D> <1>,<B1=1>
IFIDN <D> <LC>,<BLC=1>
IFIDN <D> <UC>,<BUC=1>
IFIDN <D> <I>,<BIC=1>
IFIDN <D> <CR>,<BIC=2>
IFIDN <D> <EXCL>,<BIC=4>
	>
J'ASCII=<BYTE (18) BIC (1) BUC,BLC (8) 0 (1) 1,BC,B1,B2,B4,B8,BA,BB>
	LIST
	BYTE (18) BIC (1) BUC,BLC (8) 0,J'ASCII&377
	>
IF1,<BLOCK 1>
	>


TB2741:	BALL1
	BALL2
	BALL3
	BALL4

N2741=.-TB2741
BALL1:		;JOSS BALL (#934)

JOSS 000,<B,8,4,2,1>
JOSS 001,<B,8,4,2,1>
JOSS 002,<B,8,4,2,1>
JOSS 003,<B,8,4,2,1>
JOSS 004,<B,8,4,2,1>
JOSS 005,<B,8,4,2,1>
JOSS 006,<B,8,4,2,1>
JOSS 007,<B,8,4,2,1>
JOSS 010,<C,B,8,4,2>
JOSS 011,<B,8,4,2,1>
JOSS 012,<I,C,A,8,4,1>
JOSS 013,<B,8,4,2,1>
JOSS 014,<B,8,4,2,1>
JOSS 015,<CR,C,B,8,4,1>
JOSS 016,<I,C,8,4>
JOSS 017,<I,C,B,A,8,4>
JOSS 020,<B,8,4,2,1>
JOSS 021,<B,8,4,2,1>
JOSS 022,<B,8,4,2,1>
JOSS 023,<B,8,4,2,1>
JOSS 024,<B,8,4,2,1>
JOSS 025,<B,8,4,2,1>
JOSS 026,<B,8,4,2,1>
JOSS 027,<B,8,4,2,1>
JOSS 030,<B,8,4,2,1>
JOSS 031,<B,8,4,2,1>
JOSS 032,<B,8,4,2,1>
JOSS 033,<B,8,4,2,1>
JOSS 034,<B,8,4,2,1>
JOSS 035,<B,8,4,2,1>
JOSS 036,<B,8,4,2,1>
JOSS 037,<B,8,4,2,1>
JOSS 040,<C>
JOSS 041,<EXCL,UC,1>
JOSS 042,<UC,2>
JOSS 043,<UC,C,2,1>
JOSS 044,<UC,8>
JOSS 045,<UC,4>
JOSS 046,<UC,C,4,2>
JOSS 047,<UC,1>
JOSS 050,<UC,8,2,1>
JOSS 051,<UC,C,8,1>
JOSS 052,<UC,B,A,2>
JOSS 053,<LC,B,A,2>
JOSS 054,<LC,B,A,4,2,1>
JOSS 055,<LC,B,A,8,2,1>
JOSS 056,<LC,C,B,2>
JOSS 057,<LC,B,A,8>
JOSS 060,<LC,C,8,1>
JOSS 061,<LC,1>
JOSS 062,<LC,2>
JOSS 063,<LC,C,2,1>
JOSS 064,<LC,8>
JOSS 065,<LC,4>
JOSS 066,<LC,C,4,2>
JOSS 067,<LC,C,4,1>
JOSS 070,<LC,4,2,1>
JOSS 071,<LC,8,2,1>
JOSS 072,<UC,C,B,A,4,1>
JOSS 073,<LC,C,B,A,4,1>
JOSS 074,<UC,C,4,1>
JOSS 075,<LC,C,B,4>
JOSS 076,<UC,4,2,1>
JOSS 077,<UC,B,A,8>
JOSS 100,<UC,C,B,4>
JOSS 101,<UC,C,B,4,2,1>
JOSS 102,<UC,C,A,8,2,1>
JOSS 103,<UC,C,A,4,2,1>
JOSS 104,<UC,A,4,1>
JOSS 105,<UC,C,A,4>
JOSS 106,<UC,C,B,A,2,1>
JOSS 107,<UC,B,A,1>
JOSS 110,<UC,A,8,1>
JOSS 111,<UC,B,4,2>
JOSS 112,<UC,C,B,A>
JOSS 113,<UC,A,4,2>
JOSS 114,<UC,C,A,8>
JOSS 115,<UC,C,B,1>
JOSS 116,<UC,C,A,2>
JOSS 117,<UC,C,B,8>
JOSS 120,<UC,B,A,4>
JOSS 121,<UC,C,B,A,4,2>
JOSS 122,<UC,B,4,1>
JOSS 123,<UC,B,8,1>
JOSS 124,<UC,A>
JOSS 125,<UC,A,2,1>
JOSS 126,<UC,B,2,1>
JOSS 127,<UC,C,B,8,2,1>
JOSS 130,<UC,C,A,1>
JOSS 131,<UC,C,B,A,8,1>
JOSS 132,<UC,C,8,2>
JOSS 133,<UC,B,A,4,2,1>
JOSS 134,<UC,B>
JOSS 135,<UC,C,B,2>
JOSS 136,<UC,B>
JOSS 137,<UC,B,A,8,2,1>
JOSS 140,<UC,1>
JOSS 141,<LC,C,B,4,2,1>
JOSS 142,<LC,C,A,8,2,1>
JOSS 143,<LC,C,A,4,2,1>
JOSS 144,<LC,A,4,1>
JOSS 145,<LC,C,A,4>
JOSS 146,<LC,C,B,A,2,1>
JOSS 147,<LC,B,A,1>
JOSS 150,<LC,A,8,1>
JOSS 151,<LC,B,4,2>
JOSS 152,<LC,C,B,A>
JOSS 153,<LC,A,4,2>
JOSS 154,<LC,C,A,8>
JOSS 155,<LC,C,B,1>
JOSS 156,<LC,C,A,2>
JOSS 157,<LC,C,B,8>
JOSS 160,<LC,B,A,4>
JOSS 161,<LC,C,B,A,4,2>
JOSS 162,<LC,B,4,1>
JOSS 163,<LC,B,8,1>
JOSS 164,<LC,A>
JOSS 165,<LC,A,2,1>
JOSS 166,<LC,B,2,1>
JOSS 167,<LC,C,B,8,2,1>
JOSS 170,<LC,C,A,1>
JOSS 171,<LC,C,B,A,8,1>
JOSS 172,<LC,C,8,2>
JOSS 173,<UC,B,A,4,2,1>
JOSS 174,<UC,B>
JOSS 175,<UC,C,B,2>
JOSS 176,<LC,B>
JOSS 177,<B,8,4,2,1>

CIRCLC=374
CIRCLD=264
SHFTLC=237
SHFTUC=234
BKSPC=335
IDLEC=275
BALL2:			;#137M

EXP	J000,J001,J002,J003,J004,J005,J006,J007	;000-007
EXP	J010,J011,J012,J013,J014,J015,J016,J017	;010-017
EXP	J020,J021,J022,J023,J024,J025,J026,J027	;020-027
EXP	J030,J031,J032,J033,J034,J035,J036,J037	;030-037
EXP	J040,J041,J042,J043,J045,J074,J046,J047	;040-047
EXP	J051,J132,J112,J152,J142,J176,J055,J170	;050-057
EXP	J172,J061,J062,J063,J065,J067,J066,J070	;060-067
EXP	J064,J060,J127,J167,J076,J071,J044,J130	;070-077
EXP	J050,J107,J052,J106,J120,J072,J121,J133	;100-107
EXP	J077,J131,J115,J135,J126,J100,J122,J111	;110-117
EXP	J101,J117,J123,J116,J125,J105,J104,J113	;120-127
EXP	J103,J114,J110,J102,J124,J137,J124,J134	;130-137
EXP	J140,J147,J053,J146,J160,J073,J161,J054	;140-147
EXP	J057,J171,J155,J056,J166,J075,J162,J151	;150-157
EXP	J141,J157,J163,J156,J165,J145,J144,J153	;160-167
EXP	J143,J154,J150,J102,J124,J137,J164,J177	;170-177
BALL3:			;#938

EXP	J000,J001,J002,J003,J004,J005,J006,J007	;000-007
EXP	J010,J011,J012,J013,J014,J015,J016,J017	;010-017
EXP	J020,J021,J022,J023,J024,J025,J026,J027	;020-027
EXP	J030,J031,J032,J033,J034,J035,J036,J037	;030-037
EXP	J040,J127,J076,J071,J167,J074,J152,J046	;040-047
EXP	J051,J132,J044,J112,J142&377,J176,J055&377,J170	;050-057
EXP	J172,J061,J062,J063,J065,J067,J066,J070	;060-067
EXP	J064,J060,J045,J043,J124,J047,J042,J130	;070-077
EXP	J164,J107,J052,J106,J120,J072,J121,J133	;100-107
EXP	J077,J131,J115,J135,J126,J100,J122,J111	;110-117
EXP	J101,J117,J123,J116,J125,J105,J104,J113	;120-127
EXP	J103,J114,J110,J102,J050,J137,J050,J134	;130-137
EXP	J140,J147,J053,J146,J160,J073,J161,J054	;140-147
EXP	J057,J171,J155,J056,J166,J075,J162,J151	;150-157
EXP	J141,J157,J163,J156,J165,J145,J144,J153	;160-167
EXP	J143,J154,J150,J102,J050,J137,J164,J177	;170-177
BALL4:			;#015

EXP	J000,J001,J002,J003,J004,J005,J006,J007	;000-007
EXP	J010,J011,J012,J013,J014,J015,J016,J017	;010-017
EXP	J020,J021,J022,J023,J024,J025,J026,J027	;020-027
EXP	J030,J031,J032,J033,J034,J035,J036,J037	;030-037
EXP	J040,J176,J100,J043,J044,J045,J074,J075	;040-047
EXP	J050,J051,J076,J052,J054&377,J055,J056&377,J057	;050-057
EXP	J060,J154,J062,J063,J064,J065,J066,J067	;060-067
EXP	J070,J071,J072,J073,J050,J053,J051,J077	;070-077
EXP	J042,J101,J102,J103,J104,J105,J106,J107	;100-107
EXP	J110,J111,J112,J113,J114,J115,J116,J117	;110-117
EXP	J120,J121,J122,J123,J124,J125,J126,J127	;120-127
EXP	J130,J131,J132,J047,J176,J061,J176,J137	;130-137
EXP	J075,J141,J142,J143,J144,J145,J146,J147	;140-147
EXP	J150,J151,J152,J153,J154,J155,J156,J157	;150-157
EXP	J160,J161,J162,J163,J164,J165,J166,J167	;160-167
EXP	J170,J171,J172,J047,J176,J061,J075,J177	;170-177
	DEFINE	CMD(NAME,ABRV,MODE) <
	XLIST
L1=.
	SIXBIT	"NAME"
L2=.
IF2,<IFNDEF ABRV'COM,<ABRV'COM=NULCOM>>
	REPEAT <4-L2+L1>,< 0>
	SIXBIT	"ABRV"
	LIST
	XWD	MODE,ABRV'COM>



;	TABLE OF TEXT COMMANDS TO RUNOFF

COMTAB:
	CMD	ADJUST,AJ,BREAKM!JUSTM

	CMD	BEGINPAGE,BP,BREAKM!NPAGEM

	CMD	BLANK,BK

	CMD	BOTTOMLINE,BL,BREAKM!SPACEM

	CMD	BOTTOMMARGIN,BMR

	CMD	BREAK,B,BREAKM

	CMD	CAPITALIZESENTENCES,CS,CAPSM

	CMD	CENTER,C,BREAKM!CENTRL

	CMD	CENTERLINE,CL,BREAKM

	CMD	CLEARTABS,CT

	CMD	DOUBLESPACE,DS,DSPCM

	CMD	ENDFIGURE,EFIG,BREAKM!NPAGEM

	CMD	FIGURE,FIG,BREAKM

	CMD	FILL,F,FILLM

	CMD	HEADER,H,BREAKM!HEADL!HEADM

	CMD	INDENT,I,BREAKM!DENTM

	CMD	INDENTMARGIN,IM,BREAKM

	CMD	JUSTIFY,J,BREAKM!JUSTM

	CMD	LEFTMARGIN,LMR,BREAKM

	CMD	LINE,L,BREAKM!SPACEM

	CMD	LINELENGTH,LNL,BREAKM

	CMD	LOWERCASE,LC,LOWCM

	CMD	NOCAPITALIZESENTENCES,NCS

	CMD	NOFILL,NF,BREAKM

	CMD	NOJUST,NJ,BREAKM

	CMD	NOLOWERCASE,NLC

	CMD	NONUMBERPAGES,NNP

	CMD	NOPAGEPREFIX,NPP

	CMD	NUMBERPAGESBOTTOM,NPB,PNBOT

	CMD	NUMBERPAGESTOP,NPT,PNTOP

	CMD	PAGEPREFIX,PP

	CMD	PAPERLENGTH,PRL,BREAKM

	CMD	SETTABS,ST

	CMD	SINGLESPACE,SS

	CMD	SPACE,SP,BREAKM!SPACEM

	CMD	TAB,T

	CMD	TOPMARGIN,TMR

	CMD	UNDENT,UD,BREAKM!DENTM

	CMD	UNDENTMARGIN,UM,BREAKM

	CMD	UNDERLINE,UL,ULINEM

	CMD	UPPERCASE,UC,UCM

COMTBL=.-COMTAB
;	BREAK OFF PREVIOUS LINE

BRKCOM:	PUSH	P,S		;SAVE STATUS
	TLZ	S,JUSTM		;DO NOT RIGHT ADJUST PARTIAL LINE
	SKIPE	SYMCNT		;SKIP IF NO SYMBOLS TO OUTPUT
	PUSHJ	P,OUTLIN	;OUTPUT PARTIAL LINE
	SETZM	SYMCNT		;RESET SYMBOL COUNT
	SETZM	ALNGTH		;RESET ACCUMULATED LENGTH
	POP	P,T1		;RESTORE STATUS
	TLNE	T1,JUSTM
	TLO	S,JUSTM
NULCOM:	POPJ	P,		;EXIT


;	SET BOTTOM MARGIN

BMRCOM:	MOVE	T1,PAPERL	;T1 = PAPER LENGTH
	SUB	T1,NUMARG	;T1 = PAGE LENGTH - NEW BOTTOM MARGIN
	CAMG	T1,TOPMRG	;IT SHOULD BE GREATER THAN TOP MARGIN
	POPJ	P,		;IT ISN'T, IGNORE COMMAND
	MOVEM	T1,BOTLIN	;IT WAS, STORE NEW BOTTOM LINE
	MOVE	T1,NUMARG
	MOVEM	T1,BOTMRG	;STORE NEW BOTTOM MARGIN
	POPJ	P,		;EXIT


;	INDENT SPECIFIED NUMBER OF SPACES FROM LEFT MARGIN

ICOM:	SKIPE	T1,DENT		;ARE WE ALREADY INDENTED?
	ADDM	T1,LINEL	;YES. ADJUST LINE LENGTH
	MOVE	T1,NUMARG	;T1 = INDENTATION AMOUNT
	CAML	T1,LINEL	;IT MUST BE LESS THAN LINE LENGTH
	JRST	UDCOM2		;IT ISN'T, JUMP
	MOVEM	T1,DENT		;IT IS, STORE IT
	JRST	UDCOM1		;ADJUST LINE LENGTH AND EXIT


;	SET LEFT MARGIN SPACING

LMRCOM:	MOVE	T1,NUMARG	;T1 = NEW LEFT MARGIN SETTING
	EXCH	T1,LFTMRG	;STORE IT
	SUB	T1,LFTMRG
	ADDM	T1,LINEL	;ADJUST LINE LENGTH
	POPJ	P,		;EXIT
;	SET LINE LENGTH

LNLCOM:	MOVE	T1,NUMARG	;T1 = NEW LINE LENGTH
	CAIG	T1,MAXLL	;IS IT LARGER THAN MAXIMUM LINE LENGTH?
	MOVEM	T1,LINEL	;NO. STORE IT
	POPJ	P,		;EXIT


;	DO NOT CAPITALIZE SENTENCES

NCSCOM:	TLZ	S,CAPSM		;RESET CAPITALIZE SENTENCES MODE
	POPJ	P,		;EXIT


;	SET PAPER LENGTH

PRLCOM:	MOVE	T1,NUMARG	;T1 = NEW PAPER LENGTH
	SUB	T1,BOTMRG	;T1 = PAPER LENGTH - BOTTOM MARGIN
	CAMG	T1,TOPMRG	;IS IT GREATER THAN TOP MARGIN?
	POPJ	P,		;NO.  TOO SMALL, IGNORE IT
	MOVEM	T1,BOTLIN	;STORE BOTTOM LINE
	MOVE	T1,NUMARG
	MOVEM	T1,PAPERL	;STORE PAPER LENGTH
	POPJ	P,		;EXIT


;	SPACE SPECIFIED NUMBER OF LINES BEFORE NEXT LINE

SPCOM:	MOVE	T1,NUMARG	;STORE LINE SPACING COUNT
	SKIPN	T1
	MOVEI	T1,1		;SET SPACING TO 1 IF NOT SPECIFIED
	MOVEM	T1,SPCNT
	JRST	OUTLIN		;OUTPUT SPACING AND EXIT


;	SET TOP MARGIN

TMRCOM:	MOVE	T1,NUMARG	;T1 = NEW TOP MARGIN
	CAMGE	T1,BOTLIN	;IT SHOULD BE LESS THAN BOTTOM LINE
	MOVEM	T1,TOPMRG	;IT IS, STORE IT
	POPJ	P,		;EXIT


;	DO NOT FILL LINES

NFCOM:	TLZ	S,FILLM!JUSTM	;RESET FILL MODE AND JUSTIFY MODE
	POPJ	P,		;EXIT
;	DO NOT RIGHT JUSTIFY LINES

NJCOM:	TLZ	S,JUSTM		;RESET JUSTIFY MODE
	POPJ	P,		;EXIT


;	RESET LOWER CASE MODE

NLCCOM:	TLZ	S,LOWCM		;RESET LOWER CASE MODE
	POPJ	P,		;EXIT


;	DO NOT NUMBER PAGES

NNPCOM:	TLZ	S,PNTOP!PNBOT	;RESET NUMBER PAGES AND/OR TOP MODES
	POPJ	P,		;EXIT


;	NUMBER PAGES AT TOP AND/OR BOTTOM

NPBCOM:
NPTCOM:	SKIPE	T1,NUMARG	;WAS NON-ZERO ARGUMENT SPECIFIED?
	MOVEM	T1,PAGENO	;YES. SET PAGENO TO IT
	POPJ	P,		;EXIT


;	UNDENT SPECIFIED NUMBER OF SPACES FROM LEFT MARGIN

UDCOM:	SKIPE	T1,DENT		;ARE WE ALREADY INDENTED?
	ADDM	T1,LINEL	;YES. ADJUST LINE LENGTH
	MOVE	T1,NUMARG	;T1 = UNDENTATION
	CAMLE	T1,LFTMRG	;IS IT GREATER THAN THE LEFT MARGIN?
	JRST	UDCOM2		;YES. JUMP
	MOVNM	T1,DENT		;NO. STORE IT
	MOVNS	T1
UDCOM1:	SUB	T1,LINEL	;ADJUST LINE LENGTH
	MOVNM	T1,LINEL
	POPJ	P,		;EXIT
UDCOM2:	TLZ	S,DENTM		;RESET INDENT MODE
	POPJ	P,		;EXIT


;	CENTER NEXT LINE OF OUTPUT

CLCOM:	TRO	S,CENTOL	;SET MODE BIT
	POPJ	P,		;EXIT
;	SET SINGLE SPACING (I.E. RESET DOUBLE SPACING MODE)

SSCOM:	TLZ	S,DSPCM		;RESET DOUBLE SPACING MODE
	POPJ	P,		;EXIT


;	ADD PAGE PREFIX (THE FOLLOWING LINE) TO ALL PAGE NUMBERS

PPCOM:	TROA	S,PPM!PPL	;SET PAGE PREFIX MODES


;	RESET PAGE PREFIXING MODES

NPPCOM:	TRZ	S,PPM!PPL	;RESET PAGE PREFIXING MODES
	POPJ	P,		;EXIT


;	INDENT LEFT MARGIN

IMCOM:	SKIPA	T1,NUMARG	;T1 = INDENTATION


;	UNDENT LEFT MARGIN

UMCOM:	MOVN	T1,NUMARG	;T1 = - INDENTATION
	ADD	T1,LFTMRG	;T1 = NEW LEFT MARGIN
	JRST	LMRCOM+1	;PROCESS REST OF COMMAND


;	SKIP TO BOTTOM LINE OF PAGE

BLCOM:	SKIPA	T1,BOTLIN	;T1 = DESIRED LINE


;	SKIP TO SPECIFIED LINE NUMBER

LCOM:	MOVE	T1,NUMARG	;T1 = DESIRED LINE
	SUBI	T1,1		;ADJUST PARAMETER
	CAMLE	T1,LINENO	;IS IT .LE. CURRENT LINE?
	CAMLE	T1,BOTLIN	;NO. IS IT TOO LARGE?
	POPJ	P,		;YES. EXIT
	SUB	T1,LINENO	;NO. COMPUTE NECESSARY SPACING
	MOVEM	T1,SPCNT	;STORE SPACING COUNT
	JRST	OUTLIN		;PROCESS SPACING
;	PROCESS FIGURE PAGE

FIGCOM:	SKIPN	T1,LINENO	;ARE WE AT TOP OF PAGE?
	POPJ	P,		;YES. EXIT
	MOVEM	S,SSV		;SAVE STATE
	TRO	S,FIGM		;SET PROCESSING FIGURE MODE
	TRZ	S,OFIGSW
	MOVEM	T1,LINESV	;NO. SAVE LINE NUMBER
	MOVE	T1,PAGENO	;SAVE PAGE NUMBER
	MOVEM	T1,PAGESV
	MOVE	T1,SPCNT
	MOVEM	T1,SPCNSV	;SAVE SPACING COUNT
	SETZM	LINENO
	SETZM	SPCNT
	AOS	T1,FIGCNT	;INCREMENT FIGURE COUNT
	ADD	T1,PAGENO
	ADDI	T1,1		;T1 = PAGE NUMBER FOR FIGURE
	MOVEM	T1,PAGENO	;STORE IT
	SKIPE	FIGCNT
	POPJ	P,		;EXIT IF MORE THAN 1 FIGURE
	HRRZ	T1,JOBREL	;COMPUTE AVAILABLE SPACE COUNT
	SUB	T1,JOBFF
	IMULI	T1,5
	ADDI	T1,4
	MOVEM	T1,FSCNT
	MOVE	T1,JOBFF
	HRLI	T1,<POINT 7,0>/1B17
	MOVEM	T1,FSIPNT	;INITIALIZE POINTERS
	MOVEM	T1,FSPNT
	POPJ	P,		;EXIT


;	TERMINATE FIGURE PROCESSING

EFIGCO:	PUSHJ	P,OUTLIN	;SKIP TO NEW PAGE
	TRNN	S,FIGM		;ARE WE PROCESSING A FIGURE?
	POPJ	P,		;NO. EXIT
	PUSH	P,C		;SAVE C
	SETZ	C,
	OUTC			;STORE TERMINATING NULL
	POP	P,C		;RESTORE C
	MOVE	T1,PAGENO
	EXCH	T1,PAGESV
	MOVEM	T1,PAGENO	;RESTORE PAGE NUMBER
	MOVE	T1,LINESV
	MOVEM	T1,LINENO	;RESTORE LINE NUMBER
	MOVE	T1,SPCNSV
	MOVEM	T1,SPCNT	;RESTORE SPACING COUNT
	MOVE	S,SSV		;RESTORE STATE
	TRO	S,OFIGSW	;SET OUTPUT THE FIGURE SWITCH
	POPJ	P,		;EXIT
;	SET TABS

STCOM:	JUMPE	A5,STCOM3	;JUMP IF NO ARGUMENT
STCOM1:	CAILE	A5,MAXLL	;IS TAB SETTING IN RANGE?
	JRST	STCOM2		;NO. IGNORE IT
	SETOM	TABTBL(A5)	;YES. SET TAB
STCOM2:	PUSHJ	P,GETARG	;GET NEXT TAB SETTING
	JRST	STCOM1		;PROCESS IT
	POPJ	P,		;NONE LEFT, EXIT
STCOM3:	SETZ	A5,		;CLEAR TABLE INDEX
	MOVEI	A4,1		;INITIALIZE TAB INDEX
STCOM4:	SETZM	TABTBL(A5)	;CLEAR TAB
	CAME	A5,A4
	JRST	STCOM5
	SETOM	TABTBL(A5)	;SET TABS AT 8N+1
	ADDI	A4,↑D8
STCOM5:	CAIE	A5,MAXLL-1	;ARE WE FINISHED?
	AOJA	A5,STCOM4	;NO. CONTINUE
	POPJ	P,		;YES. EXIT


;	CLEAR TABS

CTCOM:	JUMPE	A5,CTCOM3	;JUMP IF NO ARGUMENT
CTCOM1:	CAILE	A5,MAXLL	;IS TAB SETTING IN RANGE?
	JRST	CTCOM2		;NO. IGNORE IT
	SETZM	TABTBL(A5)	;YES. CLEAR IT
CTCOM2:	PUSHJ	P,GETARG	;GET NEXT TAB TO BE CLEARED
	JRST	CTCOM1		;PROCESS IT
	POPJ	P,		;NONE LEFT, EXIT
CTCOM3:	MOVEI	A5,MAXLL-1	;CLEAR TABS AT EACH POSITION
	SETZM	TABTBL(A5)
	SOJGE	A5,.-1
	POPJ	P,		;EXIT

GETARG:	SETZ	A5,		;CLEAR ARGUMENT VALUE
	JNE	54,GETAR2	;IF NOT COMMA, EXIT
GETAR1:	GETC
	JNN	GETAR3		;IF NOT NUMERIC, EXIT
	IMULI	A5,↑D10
	ADDI	A5,-"0"(C)	;ACCUMULATE DIGIT
	JRST	GETAR1		;CONTINUE
GETAR2:	AOS	(P)		;END OF ARGUMENTS, RETURN
GETAR3:	POPJ	P,		;EXIT
;	TAB TO NEXT TAB SETTING OR TO SPECIFIED POSITION

TCOM:	TLNE	S,FILLM		;NOFILL MODE?
	TLNE	S,JUSTM		;NO. JUSTIFYING?
	POPJ	P,		;YES. IGNORE COMMAND
	SOJLE	A5,TCOM1	;JUMP IF ARGUMENT NOT SPECIFIED
	CAMG	A5,ALNGTH	;ARE WE AT OR PAST DESIRED POSITION?
	POPJ	P,		;YES. IGNORE COMMAND
	SUB	A5,ALNGTH	;NO. A5 = DESIRED SPACING
	JRST	TCOM3
TCOM1:	MOVE	A4,ALNGTH	;NO ARGUMENT, COUNT SPACES TO NEXT TAB
	MOVEI	A5,1
TCOM2:	ADDI	A4,1
	CAMGE	A4,LINEL
	SKIPE	TABTBL+1(A4)
	JRST	.+2
	AOJA	A5,TCOM2
TCOM3:	AOS	T1,SYMCNT	;CREATE SYMBOL WITH (A5)-1 SPACES
	ADDM	A5,ALNGTH	;INCREMENT ACCUMULATED LENGTH
	LDB	A1,[POINT 9,SYMPNT-2(T1),26]
	ADDI	A1,4
	IDIVI	A1,5
	HLRZ	SP,SYMPNT-2(T1)
	ADD	SP,A1
	HRLZM	SP,SYMPNT-1(T1)
	SOJLE	A5,TCOM4
	HRLI	SP,(POINT 7,0)
	PUSH	P,C
	MOVEI	C," "
	TLO	SS,DONTUL	;SET DON'T UNDERLINE SWITCH
	PUSHJ	P,STOREC
	SOJG	A5,.-1
	TLZ	SS,DONTUL	;RESET DON'T UNDERLINE SWITCH
	POP	P,C
TCOM4:	POPJ	P,		;EXIT


;	INSERT BLANKS

BKCOM:	TLNE	S,FILLM		;NOFILL MODE?
	TLNE	S,JUSTM		;NO. JUSTIFYING?
	POPJ	P,		;YES. IGNORE COMMAND
	SOJG	A5,TCOM3	;IF MORE THAN 1 BLANK, JUMP
	POPJ	P,		;OTHERWISE, EXIT
;	BEGIN PAGE COMMAND
;
;	IF ARGUMENT IS NON-ZERO, A NEW PAGE IS BEGUN IF THE
;	NUMBER OF REMAINING LINES ON THE PAGE IS
;	LESS THAN THE SPECIFIED ARGUMENT

BPCOM:	SKIPG	T1,NUMARG	;SKIP IF AN ARGUMENT
	JRST	OUTLIN		;ELSE BEGIN A PAGE
	ADD	T1,LINENO	;T1 = CURRENT LINE + N
	TLZ	S,NPAGEM	;RESET NEW PAGE MODE
	CAMG	T1,BOTLIN	;IF (T1) > BOTLIN BEGIN PAGE
	POPJ	P,		;OTHERWISE EXIT
	TLO	S,NPAGEM	;SET NEW PAGE MODE
	JRST	OUTLIN		;SKIP TO A NEW PAGE
;	CHARACTER CLASS TABLE
;
;		FIELD #1 [0,0]:		1  IF ALPHABETIC
;					0  IF NOT ALPHABETIC
;
;		FIELD #2 [1,1]:		1  IF NUMERIC
;					0  IF NOT NUMERIC
;
;		FIELD #3 [2,2]:		1  FILL MODE CHARACTER
;					0  NULL CHARACTER IN FILL MODE
;
;		FIELD #4 [3,3]:		1  NOFILL MODE CHARACTER
;					0  NULL CHARACTER IN NOFILL MODE
;
;		FIELD #5 [4,4]:		1  FILL MODE CONTROL CHARACTER
;					0  NOT FILL MODE CONTROL CHARACTER
;
;		FIELD #6 [5,5]:		1  IF CHARACTER PRINTS ON TTY33
;					0  IF CHARACTER NON-PRINTING ON TTY33
;
;		FIELD #7 [6,12]:	CHARACTER TO BE OUTPUT IN PLACE
;					OF THIS NON-PRINTING (ON TTY33) CHARACTER
;
;		FIELD #8 [13,14]:	0  IF CHARACTER LENGTH = -1
;					1  IF CHARACTER LENGTH =  0
;					2  IF CHARACTER LENGTH =  1
;
;		FIELD #9 [15,15]:	1  NOFILL MODE CONTROL CHARACTER
;					0  NOT NOFILL MODE CONTROL CHARACTER
;
;		FIELD #10 [16,16]:	1  HIDDEN CHARACTER ON LP10E
;					0  NOT A HIDDEN CHARACTER ON LP10E
;
;		FIELD #11 [17,17]:	1  CHARACTER IS AN END OF SENTENCE INDICATOR
;					0  CHARACTER NOT AN ESI INDICATOR



;	CHARACTER CLASS DEFINITIONS

	CA=1B18
	CN=1B19
	CF=1B20
	CNF=1B21
	CFC=1B22
	CTTY33=1B23
	CNFC=1B33
	CLPEH=1B34
	CEST=1B35
	DEFINE	BY(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11),<
	LIST
	BYTE (1) X1,X2,X3,X4,X5,X6 (7) X7 (2) X8 (1) X9,X10,X11 (18) 0>


	DEFINE	C <
	XLIST
IF1,<BLOCK 1>
IF2,<
I=.-CLASS
F1=0
F2=0
F3=0
F4=0
F5=0
F6=0
F7=0
F8=2
F9=0
F10=0
F11=0
IFGE I-"A",<IFLE I-"Z",<F1=1>>
IFGE I-"A"-40,<IFLE I-"Z"-40,<F1=1
 F7=I>>
IFLE I-37,<F8=1>
IFE I-177,<F8=1>
IFGE I-"0",<IFLE I-"9",<F2=1>>
IFE I-10,<F3=1
 F4=1
 F8=0>
IFGE I-41,<IFLE I-176,<F3=1
 F4=1>>
IFE I-15,<F5=1
 F9=1>
IFE I-" ",<F5=1
 F4=1
 F11=1>
IFE I-".",<F5=1
 F9=1
 F11=1>
IFE I-"↑",<F5=1
 F9=1>
IFE I-"?",<F5=1
 F11=1>
IFE I-"!",<F5=1
 F11=1>
IFE I-11,<F6=1
 F9=1
 F5=1
 F4=1>
IFGE I-" ",<IFLE I-"←",<F6=1>>
IFE I-177,<F10=1>
IFE I,<F10=1>
IFGE I-11,<IFLE I-15,<F10=1>>
IFGE I-20,<IFLE I-24,<F10=1>>
IFE I-",",<F11=1>
IFE I-")",<F11=1>
IFE I-"""",<F11=1>
IFE I-073,<F11=1>
IFE I-":",<F11=1>
BY \F1,\F2,\F3,\F4,\F5,\F6,\F7,\F8,\F9,\F10,\F11
>>
CLASS:

;	ASCII 000-017

	REPEAT	20,<C>
;	ASCII 020-037

	REPEAT	20,<C>
;	ASCII 040-057

	REPEAT	20,<C>
;	ASCII 060-077

	REPEAT	20,<C>
;	ASCII 100-117

	REPEAT	20,<C>
;	ASCII 120-137

	REPEAT	20,<C>
;	ASCII 140-157

	REPEAT	20,<C>
;	ASCII 160-177

	REPEAT	20,<C>
SPECER:	MOVEI	PNT,[ASCIZ /Error in specification!/]
	JRST	ERRTYP
LPTTST:	TLNN	A1,40000	;IS OUTPUT TO LPT?
	JRST	OPNERR		;NO.
	TYPE	[ASCIZ /LPT is busy. I'll wait for it. Type ahead./]
	TYPE	CRLF
	MOVEI	T1,1		;SLEEP FOR 1 SECOND
	CALLI	T1,SLEEP
	OPEN	OUT,OPENO	;TRY OPENING OUTPUT AGAIN
	JRST	.-3		;STILL BUSY, SLEEP SOME MORE
	JRST	OPN3A		;OKAY, CONTINUE PROCESSING
OPNERR:	MOVEI	PNT,[ASCIZ /I can't open the channel!/]
	JRST	ERRTYP
LKERR:	MOVEI	PNT,[ASCIZ /I can't find the input file!/]
	JRST	ERRTYP
ENTERR:	MOVEI	PNT,[ASCIZ /I can't write the output file!/]

ERRTYP:	HRLI	PNT,<POINT 7,0>/1B17
	PUSHJ	P,TYPEIT
	TYPE	CRLF
	SETZM	TTYI+2		;CLEAR INPUT BUFFER
	JRST	RUNOFF

COMER0:	POP	P,T1
COMER:	POP	P,T1
	TYPE	[ASCIZ /Command error!/]
	TYPE	CRLF
	SETZM	TTYI+2		;CLEAR INPUT BUFFER
	JRST	RUN4


;	INITIAL STATE VECTOR:

ISTATE:	XWD	STOPM!JUSTM!FILLM!SOSM,0
CRLF:	BYTE	(7) 15,12	;CR LF
BELL:	BYTE	(7) 7		;ASCII CODE TO RING BELL ON TTY
PSYML:	POINT	9,SYMPNT-1(T2),35
PSYMC:	POINT	9,SYMPNT-1(T2),26
RMULT:	EXP	5*5*5*5*5*5*5*5*5*5*5*5*5*5*5
	LIT
;	DATA AREA (IMPURE DATA AREA)

DATA:				;START OF CONSTANT DATA AREA

	PHASE	140

TTYIO:	1
	SIXBIT	/TTY/
	XWD	TTYO,TTYI
OPENI:	1			;INPUT OPEN SPECIFICATION BUFFER
	SIXBIT	/DSK/
	XWD	0,INBUF
OPENO:	1			;OUTPUT OPEN SPECIFICATION BUFFER
	SIXBIT	/TTY/
	XWD	OUTBUF,0

OPNT:	OUT	OUT,
	EXP	OUTBUF+1
	EXP	OUTBUF+2
IPNT:	IN	IN,
	EXP	INBUF+1
	EXP	INBUF+2
	STATZ	IN,740000

P2741:	XWD	C,BALL1		;BALL #1 ASSUMED INITIALLY

	VAR

DATAE=.-1			;END OF INITIALIZED CONSTANT DATA AREA

	LC=.
	DEPHASE
	RELOC	LC-140

	B	DATBEG,0		;START OF AREA WHICH IS CLEARED AT EACH START
	B	PS,PSL			;PUSH-DOWN STACK
	B	LB,4			;LOOKUP BUFFER
	B	EB,4			;ENTER BUFFER
	B	TTYI,3			;TTY INPUT BUFFER HEADER
	B	TTYO,3			;TTY OUTPUT BUFFER HEADER
	B	INBUF,3			;INPUT BUFFER RING HEADER
	B	OUTBUF,3		;OUTPUT BUFFER RING HEADER
	B	RANDOM,1		;STORAGE WORD FOR RANDOM NUMBERS
	B	SKPCNT,1		;PAGE SKIP COUNTER
	B	LFTMRG,1		;LEFT MARGIN SETTING
	B	PGBIAS,1		;PAGE MARGIN BIAS
	B	TOPMRG,1		;TOP MARGIN SETTING
	B	BOTMRG,1		;BOTTOM MARGIN SETTING
	B	BOTLIN,1		;LINE # OF BOTTOM LINE
	B	LINEL,1			;LINE LENGTH
	B	PAPERL,1		;PAPER LENGTH
	B	LINENO,1		;CURRENT LINE #
	B	PAGENO,1		;CURRENT PAGE #
	B	NUMARG,1		;NUMERIC ARGUMENT OF COMMAND
	B	DENT,1			;INDENTATION (UNDENTATION) FROM LEFT MARGIN
	B	SPCNT,1			;LINE COUNT TO BE SPACED BEFORE NEXT LINE
	B	LFCHR,1			;LINE FEED CHARACTER FOR OUTPUT
	B	FSCNT,1			;AVAILABLE SPACE COUNTER
	B	FSIPNT,1		;INITIAL POINTER TO AVAILABLE SPACE
	B	FSPNT,1			;POINTER FOR FIGURE BUFFER
	B	PAGESV,1		;SAVED PAGE NUMBER
	B	LINESV,1		;SAVED LINE NUMBER
	B	SPCNSV,1		;SAVED SPACING COUNT
	B	FIGCNT,1		;FIGURE COUNTER
	B	SSV,1			;STATE SAVED HERE
	B	CRCNT,1			;CARRIAGE RETURN COUNTER
	B	SLWCNT,1		;SLOW OUTPUT COUNTER
	B	HPOS,1			;HORIZONTAL POSITION
	B	SPCTR,1			;SPACE COUNTER
	B	ILL,1			;INITIAL LINE LENGTH
	B	DLYSCT,1		;DELAYED SPACES COUNT
	B	CSAVE,1			;C SAVED HERE
;	FORMAT OF SYMBOL POINTER WORD IN SYMBOL POINTER TABLE:
;
;	BYTE (18) SYMBOL ADDRESS (9) CHARACTER COUNT (9) SYMBOL LENGTH


	B	SYMCNT,1		;SYMBOL COUNTER

	B	SYMPN1,1		;THIS MUST PRECEDE SYMPNT

	B	SYMPNT,MAXLL/2		;SYMBOL POINTER TABLE

	B	TABTBL,MAXLL		;TAB TABLE

	B	SYMTAB,3*MAXLL/2	;SYMBOL STORAGE TABLE

	B	ALNGTH,1		;ACCUMULATED LINE LENGTH

	B	HEADBF,3*<MAXLL+5>/5	;HEADING BUFFER

	B	PPWRD,1			;PAGE PREFIX CONTROL WORD
	B	PPBUF,3*<MAXLL+5>/5	;PAGE PREFIX BUFFER

	B	ENDRUN,0



	END	RUNOFF